diff --git a/applications/external/totp/application.fam b/applications/external/totp/application.fam index fcac78700..4d9fe4634 100644 --- a/applications/external/totp/application.fam +++ b/applications/external/totp/application.fam @@ -3,9 +3,19 @@ App( name="Authenticator", apptype=FlipperAppType.EXTERNAL, entry_point="totp_app", - requires=["gui", "cli", "dialogs", "storage", "input", "notification", "bt"], + cdefines=["APP_TOTP"], + requires=[ + "gui", + "cli", + "dialogs", + "storage", + "input", + "notification", + "bt" + ], stack_size=2 * 1024, order=20, + fap_version="2.3", fap_author="Alexander Kopachov (@akopachov)", fap_description="Software-based TOTP authenticator for Flipper Zero device", fap_weburl="https://github.com/akopachov/flipper-zero_authenticator", @@ -28,5 +38,8 @@ App( Lib( name="roll_value", ), + Lib( + name="fonts", + ), ], ) diff --git a/applications/external/totp/cli/cli_helpers.h b/applications/external/totp/cli/cli_helpers.h index 0f8b24364..b8f4f236a 100644 --- a/applications/external/totp/cli/cli_helpers.h +++ b/applications/external/totp/cli/cli_helpers.h @@ -22,10 +22,7 @@ extern const char* TOTP_CLI_COLOR_INFO; #define TOTP_CLI_PRINTF(format, ...) printf(format, ##__VA_ARGS__) #define TOTP_CLI_PRINTF_COLORFUL(color, format, ...) \ - printf("\e[%s", color); \ - printf(format, ##__VA_ARGS__); \ - printf("\e[0m"); \ - fflush(stdout) + TOTP_CLI_PRINTF("\e[%s" format "\e[0m", color, ##__VA_ARGS__) #define TOTP_CLI_PRINTF_ERROR(format, ...) \ TOTP_CLI_PRINTF_COLORFUL(TOTP_CLI_COLOR_ERROR, format, ##__VA_ARGS__) diff --git a/applications/external/totp/cli/commands/add/add.c b/applications/external/totp/cli/commands/add/add.c index b2cd01352..fa64bd41c 100644 --- a/applications/external/totp/cli/commands/add/add.c +++ b/applications/external/totp/cli/commands/add/add.c @@ -102,15 +102,22 @@ void totp_cli_command_add_docopt_options() { TOTP_CLI_PRINTF(" " DOCOPT_OPTION( TOTP_CLI_COMMAND_ARG_ALGO_PREFIX, DOCOPT_ARGUMENT( - TOTP_CLI_COMMAND_ARG_ALGO)) " Token hashing algorithm. Must be one of: " TOTP_TOKEN_ALGO_SHA1_NAME - ", " TOTP_TOKEN_ALGO_SHA256_NAME - ", " TOTP_TOKEN_ALGO_SHA512_NAME - ", " TOTP_TOKEN_ALGO_STEAM_NAME - " " DOCOPT_DEFAULT(TOTP_TOKEN_ALGO_SHA1_NAME) "\r\n"); - TOTP_CLI_PRINTF(" " DOCOPT_OPTION( - TOTP_CLI_COMMAND_ARG_DIGITS_PREFIX, - DOCOPT_ARGUMENT( - TOTP_CLI_COMMAND_ARG_DIGITS)) " Number of digits to generate, one of: 5, 6, 8 " DOCOPT_DEFAULT("6") "\r\n"); + TOTP_CLI_COMMAND_ARG_ALGO)) " Token hashing algorithm. Must be one of: " TOKEN_HASH_ALGO_SHA1_NAME + ", " TOKEN_HASH_ALGO_SHA256_NAME + ", " TOKEN_HASH_ALGO_SHA512_NAME + ", " TOKEN_HASH_ALGO_STEAM_NAME + " " DOCOPT_DEFAULT(TOKEN_HASH_ALGO_SHA1_NAME) "\r\n"); + TOTP_CLI_PRINTF( + " " DOCOPT_OPTION( + TOTP_CLI_COMMAND_ARG_DIGITS_PREFIX, + DOCOPT_ARGUMENT( + TOTP_CLI_COMMAND_ARG_DIGITS)) " Number of digits to generate, one of: %" PRIu8 + ", %" PRIu8 ", %" PRIu8 + " " DOCOPT_DEFAULT("%" PRIu8) "\r\n", + TokenDigitsCountFive, + TokenDigitsCountSix, + TokenDigitsCountEight, + TokenDigitsCountSix); TOTP_CLI_PRINTF(" " DOCOPT_OPTION( TOTP_CLI_COMMAND_ARG_SECRET_ENCODING_PREFIX, @@ -120,27 +127,32 @@ void totp_cli_command_add_docopt_options() { " " DOCOPT_DEFAULT( PLAIN_TOKEN_ENCODING_BASE32_NAME) "\r\n"); - TOTP_CLI_PRINTF(" " DOCOPT_OPTION( - TOTP_CLI_COMMAND_ARG_DURATION_PREFIX, - DOCOPT_ARGUMENT( - TOTP_CLI_COMMAND_ARG_DURATION)) " Token lifetime duration in seconds, between: 15 and 255 " DOCOPT_DEFAULT("30") "\r\n"); + TOTP_CLI_PRINTF( + " " DOCOPT_OPTION( + TOTP_CLI_COMMAND_ARG_DURATION_PREFIX, + DOCOPT_ARGUMENT( + TOTP_CLI_COMMAND_ARG_DURATION)) " Token lifetime duration in seconds, between: %" PRIu8 + " and %" PRIu8 + " " DOCOPT_DEFAULT("%" PRIu8) "\r\n", + TokenDurationMin, + TokenDurationMax, + TokenDurationDefault); TOTP_CLI_PRINTF(" " DOCOPT_SWITCH( TOTP_CLI_COMMAND_ARG_UNSECURE_PREFIX) " Show console user input as-is without masking\r\n"); TOTP_CLI_PRINTF(" " DOCOPT_OPTION( TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE_PREFIX, DOCOPT_ARGUMENT( - TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE)) " Token automation features to be enabled. Must be one of: " TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME - ", " TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME - ", " TOTP_TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME + TOTP_CLI_COMMAND_ARG_AUTOMATION_FEATURE)) " Token automation features to be enabled. Must be one of: " TOKEN_AUTOMATION_FEATURE_NONE_NAME + ", " TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME + ", " TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME " " DOCOPT_DEFAULT( - TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME) "\r\n"); - TOTP_CLI_PRINTF(" # " TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME - " - No features\r\n"); - TOTP_CLI_PRINTF(" # " TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME + TOKEN_AUTOMATION_FEATURE_NONE_NAME) "\r\n"); + TOTP_CLI_PRINTF(" # " TOKEN_AUTOMATION_FEATURE_NONE_NAME " - No features\r\n"); + TOTP_CLI_PRINTF(" # " TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME " - Type key at the end of token input automation\r\n"); - TOTP_CLI_PRINTF(" # " TOTP_TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME + TOTP_CLI_PRINTF(" # " TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME " - Type key at the end of token input automation\r\n"); - TOTP_CLI_PRINTF(" # " TOTP_TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME + TOTP_CLI_PRINTF(" # " TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME " - Type slower\r\n"); } diff --git a/applications/external/totp/features_config.h b/applications/external/totp/features_config.h index 59a1e0ecc..54bbaba94 100644 --- a/applications/external/totp/features_config.h +++ b/applications/external/totp/features_config.h @@ -4,19 +4,21 @@ #endif // Include Bluetooth token input automation +#ifndef TOTP_NO_BADBT_TYPE #define TOTP_BADBT_TYPE_ENABLED +#endif // Include token input automation icons on the main screen +#ifndef TOTP_NO_AUTOMATION_ICONS #define TOTP_AUTOMATION_ICONS_ENABLED +#endif // List of compatible firmwares -#define TOTP_FIRMWARE_OFFICIAL_STABLE 1 -#define TOTP_FIRMWARE_OFFICIAL_DEV 2 -#define TOTP_FIRMWARE_UL_XFW 3 // XFW and UL now has same bluetooth mac/advname changing API +#define TOTP_FIRMWARE_OFFICIAL_STABLE (1) +#define TOTP_FIRMWARE_OFFICIAL_DEV (2) +#define TOTP_FIRMWARE_XTREME_UL (3) // End of list -// Target firmware to build for -#define TOTP_TARGET_FIRMWARE TOTP_FIRMWARE_UL_XFW - -// Max custom fonts value -#define MAX_CUSTOM_FONTS (9) \ No newline at end of file +#ifndef TOTP_TARGET_FIRMWARE +#define TOTP_TARGET_FIRMWARE TOTP_FIRMWARE_XTREME_UL +#endif diff --git a/applications/external/totp/ui/fonts/712serif/712serif.c b/applications/external/totp/lib/fonts/712serif/712serif.c similarity index 99% rename from applications/external/totp/ui/fonts/712serif/712serif.c rename to applications/external/totp/lib/fonts/712serif/712serif.c index 0fe73378c..7d0b9f1e9 100644 --- a/applications/external/totp/ui/fonts/712serif/712serif.c +++ b/applications/external/totp/lib/fonts/712serif/712serif.c @@ -931,6 +931,7 @@ const FONT_CHAR_INFO _712Serif_24ptDescriptors[] = { /* Font information for 7:12 Serif 24pt */ const FONT_INFO _712Serif_24ptFontInfo = { + "712 Serif", 14, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/712serif/712serif.h b/applications/external/totp/lib/fonts/712serif/712serif.h similarity index 100% rename from applications/external/totp/ui/fonts/712serif/712serif.h rename to applications/external/totp/lib/fonts/712serif/712serif.h diff --git a/applications/external/totp/lib/fonts/available_fonts.c b/applications/external/totp/lib/fonts/available_fonts.c new file mode 100644 index 000000000..dd019a758 --- /dev/null +++ b/applications/external/totp/lib/fonts/available_fonts.c @@ -0,0 +1,23 @@ +#include "available_fonts.h" +#include "712serif/712serif.h" +#include "bedstead/bedstead.h" +#include "dpcomic/dpcomic.h" +#include "funclimbing/funclimbing.h" +#include "graph35pix/graph35pix.h" +#include "karma_future/karma_future.h" +#include "mode_nine/mode_nine.h" +#include "pixelflag/pixelflag.h" +#include "redhat_mono/redhat_mono.h" +#include "zector/zector.h" + +const FONT_INFO* const available_fonts[AVAILABLE_FONTS_COUNT] = { + &modeNine_15ptFontInfo, + &_712Serif_24ptFontInfo, + &bedstead_17ptFontInfo, + &dPComic_18ptFontInfo, + &funclimbingDemo_18ptFontInfo, + &graph35pix_12ptFontInfo, + &karmaFuture_14ptFontInfo, + &pixelFlag_18ptFontInfo, + &redHatMono_16ptFontInfo, + &zector_18ptFontInfo}; diff --git a/applications/external/totp/lib/fonts/available_fonts.h b/applications/external/totp/lib/fonts/available_fonts.h new file mode 100644 index 000000000..fd4b0c1da --- /dev/null +++ b/applications/external/totp/lib/fonts/available_fonts.h @@ -0,0 +1,7 @@ +#pragma once + +#include "font_info.h" + +#define AVAILABLE_FONTS_COUNT (10) + +extern const FONT_INFO* const available_fonts[AVAILABLE_FONTS_COUNT]; diff --git a/applications/external/totp/ui/fonts/bedstead/bedstead.c b/applications/external/totp/lib/fonts/bedstead/bedstead.c similarity index 99% rename from applications/external/totp/ui/fonts/bedstead/bedstead.c rename to applications/external/totp/lib/fonts/bedstead/bedstead.c index ec6680fab..6b23a39d4 100644 --- a/applications/external/totp/ui/fonts/bedstead/bedstead.c +++ b/applications/external/totp/lib/fonts/bedstead/bedstead.c @@ -1047,6 +1047,7 @@ const FONT_CHAR_INFO bedstead_17ptDescriptors[] = { /* Font information for Bedstead 17pt */ const FONT_INFO bedstead_17ptFontInfo = { + "Bedstead", 16, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/bedstead/bedstead.h b/applications/external/totp/lib/fonts/bedstead/bedstead.h similarity index 100% rename from applications/external/totp/ui/fonts/bedstead/bedstead.h rename to applications/external/totp/lib/fonts/bedstead/bedstead.h diff --git a/applications/external/totp/ui/fonts/dpcomic/dpcomic.c b/applications/external/totp/lib/fonts/dpcomic/dpcomic.c similarity index 99% rename from applications/external/totp/ui/fonts/dpcomic/dpcomic.c rename to applications/external/totp/lib/fonts/dpcomic/dpcomic.c index e9c5ea1de..7d215c273 100644 --- a/applications/external/totp/ui/fonts/dpcomic/dpcomic.c +++ b/applications/external/totp/lib/fonts/dpcomic/dpcomic.c @@ -1105,6 +1105,7 @@ const FONT_CHAR_INFO dPComic_18ptDescriptors[] = { /* Font information for DPComic 18pt */ const FONT_INFO dPComic_18ptFontInfo = { + "DP Comic", 17, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/dpcomic/dpcomic.h b/applications/external/totp/lib/fonts/dpcomic/dpcomic.h similarity index 100% rename from applications/external/totp/ui/fonts/dpcomic/dpcomic.h rename to applications/external/totp/lib/fonts/dpcomic/dpcomic.h diff --git a/applications/external/totp/ui/fonts/font_info.h b/applications/external/totp/lib/fonts/font_info.h similarity index 96% rename from applications/external/totp/ui/fonts/font_info.h rename to applications/external/totp/lib/fonts/font_info.h index 86c131ec9..b7bf6a045 100644 --- a/applications/external/totp/ui/fonts/font_info.h +++ b/applications/external/totp/lib/fonts/font_info.h @@ -14,11 +14,11 @@ typedef struct { // Describes a single font typedef struct { + const char* name; // Font name const uint8_t height; // height, in pages (8 pixels), of the font's characters const uint8_t startChar; // the first character in the font (e.g. in charInfo and data) const uint8_t endChar; // the last character in the font const uint8_t spacePixels; // number of pixels that a space character takes up const FONT_CHAR_INFO* charInfo; // pointer to array of char information const uint8_t* data; // pointer to generated array of character visual representation - } FONT_INFO; \ No newline at end of file diff --git a/applications/external/totp/ui/fonts/funclimbing/funclimbing.c b/applications/external/totp/lib/fonts/funclimbing/funclimbing.c similarity index 99% rename from applications/external/totp/ui/fonts/funclimbing/funclimbing.c rename to applications/external/totp/lib/fonts/funclimbing/funclimbing.c index d6b1a0c97..4176e1f37 100644 --- a/applications/external/totp/ui/fonts/funclimbing/funclimbing.c +++ b/applications/external/totp/lib/fonts/funclimbing/funclimbing.c @@ -1163,6 +1163,7 @@ const FONT_CHAR_INFO funclimbingDemo_18ptDescriptors[] = { /* Font information for fun climbing (Demo) 18pt */ const FONT_INFO funclimbingDemo_18ptFontInfo = { + "Fun Climbing", 18, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/funclimbing/funclimbing.h b/applications/external/totp/lib/fonts/funclimbing/funclimbing.h similarity index 100% rename from applications/external/totp/ui/fonts/funclimbing/funclimbing.h rename to applications/external/totp/lib/fonts/funclimbing/funclimbing.h diff --git a/applications/external/totp/ui/fonts/graph35pix/graph35pix.c b/applications/external/totp/lib/fonts/graph35pix/graph35pix.c similarity index 99% rename from applications/external/totp/ui/fonts/graph35pix/graph35pix.c rename to applications/external/totp/lib/fonts/graph35pix/graph35pix.c index fd93d4de9..d4edf52e2 100644 --- a/applications/external/totp/ui/fonts/graph35pix/graph35pix.c +++ b/applications/external/totp/lib/fonts/graph35pix/graph35pix.c @@ -931,6 +931,7 @@ const FONT_CHAR_INFO graph35pix_12ptDescriptors[] = { /* Font information for Graph 35+ pix 12pt */ const FONT_INFO graph35pix_12ptFontInfo = { + "Graph 35pix", 14, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/graph35pix/graph35pix.h b/applications/external/totp/lib/fonts/graph35pix/graph35pix.h similarity index 100% rename from applications/external/totp/ui/fonts/graph35pix/graph35pix.h rename to applications/external/totp/lib/fonts/graph35pix/graph35pix.h diff --git a/applications/external/totp/ui/fonts/karma_future/karma_future.c b/applications/external/totp/lib/fonts/karma_future/karma_future.c similarity index 99% rename from applications/external/totp/ui/fonts/karma_future/karma_future.c rename to applications/external/totp/lib/fonts/karma_future/karma_future.c index ed6201441..23bebbc01 100644 --- a/applications/external/totp/ui/fonts/karma_future/karma_future.c +++ b/applications/external/totp/lib/fonts/karma_future/karma_future.c @@ -1163,6 +1163,7 @@ const FONT_CHAR_INFO karmaFuture_14ptDescriptors[] = { /* Font information for Karma Future 14pt */ const FONT_INFO karmaFuture_14ptFontInfo = { + "Karma Future", 18, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/karma_future/karma_future.h b/applications/external/totp/lib/fonts/karma_future/karma_future.h similarity index 100% rename from applications/external/totp/ui/fonts/karma_future/karma_future.h rename to applications/external/totp/lib/fonts/karma_future/karma_future.h diff --git a/applications/external/totp/ui/fonts/mode_nine/mode_nine.c b/applications/external/totp/lib/fonts/mode_nine/mode_nine.c similarity index 99% rename from applications/external/totp/ui/fonts/mode_nine/mode_nine.c rename to applications/external/totp/lib/fonts/mode_nine/mode_nine.c index ca2191789..5d19f59aa 100644 --- a/applications/external/totp/ui/fonts/mode_nine/mode_nine.c +++ b/applications/external/totp/lib/fonts/mode_nine/mode_nine.c @@ -932,6 +932,7 @@ const FONT_CHAR_INFO modeNine_15ptDescriptors[] = { /* Font information for ModeNine 15pt */ const FONT_INFO modeNine_15ptFontInfo = { + "Mode Nine", 14, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/mode_nine/mode_nine.h b/applications/external/totp/lib/fonts/mode_nine/mode_nine.h similarity index 100% rename from applications/external/totp/ui/fonts/mode_nine/mode_nine.h rename to applications/external/totp/lib/fonts/mode_nine/mode_nine.h diff --git a/applications/external/totp/ui/fonts/pixelflag/pixelflag.c b/applications/external/totp/lib/fonts/pixelflag/pixelflag.c similarity index 99% rename from applications/external/totp/ui/fonts/pixelflag/pixelflag.c rename to applications/external/totp/lib/fonts/pixelflag/pixelflag.c index 2b7be9eb8..eacf36b28 100644 --- a/applications/external/totp/ui/fonts/pixelflag/pixelflag.c +++ b/applications/external/totp/lib/fonts/pixelflag/pixelflag.c @@ -1105,6 +1105,7 @@ const FONT_CHAR_INFO pixelFlag_18ptDescriptors[] = { /* Font information for {PixelFlag} 18pt */ const FONT_INFO pixelFlag_18ptFontInfo = { + "Pixel Flag", 17, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/pixelflag/pixelflag.h b/applications/external/totp/lib/fonts/pixelflag/pixelflag.h similarity index 100% rename from applications/external/totp/ui/fonts/pixelflag/pixelflag.h rename to applications/external/totp/lib/fonts/pixelflag/pixelflag.h diff --git a/applications/external/totp/ui/fonts/redhat_mono/redhat_mono.c b/applications/external/totp/lib/fonts/redhat_mono/redhat_mono.c similarity index 99% rename from applications/external/totp/ui/fonts/redhat_mono/redhat_mono.c rename to applications/external/totp/lib/fonts/redhat_mono/redhat_mono.c index 77f639d4a..e39b6c81c 100644 --- a/applications/external/totp/ui/fonts/redhat_mono/redhat_mono.c +++ b/applications/external/totp/lib/fonts/redhat_mono/redhat_mono.c @@ -1048,6 +1048,7 @@ const FONT_CHAR_INFO redHatMono_16ptDescriptors[] = { /* Font information for Red Hat Mono 16pt */ const FONT_INFO redHatMono_16ptFontInfo = { + "RedHat Mono", 16, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/redhat_mono/redhat_mono.h b/applications/external/totp/lib/fonts/redhat_mono/redhat_mono.h similarity index 100% rename from applications/external/totp/ui/fonts/redhat_mono/redhat_mono.h rename to applications/external/totp/lib/fonts/redhat_mono/redhat_mono.h diff --git a/applications/external/totp/ui/fonts/zector/zector.c b/applications/external/totp/lib/fonts/zector/zector.c similarity index 99% rename from applications/external/totp/ui/fonts/zector/zector.c rename to applications/external/totp/lib/fonts/zector/zector.c index f49d8b306..c94e455e4 100644 --- a/applications/external/totp/ui/fonts/zector/zector.c +++ b/applications/external/totp/lib/fonts/zector/zector.c @@ -1047,6 +1047,7 @@ const FONT_CHAR_INFO zector_18ptDescriptors[] = { /* Font information for Zector 18pt */ const FONT_INFO zector_18ptFontInfo = { + "Zector", 16, /* Character height */ '-', /* Start character */ 'Y', /* End character */ diff --git a/applications/external/totp/ui/fonts/zector/zector.h b/applications/external/totp/lib/fonts/zector/zector.h similarity index 100% rename from applications/external/totp/ui/fonts/zector/zector.h rename to applications/external/totp/lib/fonts/zector/zector.h diff --git a/applications/external/totp/services/config/config.c b/applications/external/totp/services/config/config.c index 7b935e1ea..5b7cd936e 100644 --- a/applications/external/totp/services/config/config.c +++ b/applications/external/totp/services/config/config.c @@ -15,9 +15,6 @@ #define CONFIG_FILE_PATH CONFIG_FILE_DIRECTORY_PATH "/totp.conf" #define CONFIG_FILE_BACKUP_DIR CONFIG_FILE_DIRECTORY_PATH "/backups" #define CONFIG_FILE_BACKUP_BASE_PATH CONFIG_FILE_BACKUP_DIR "/totp.conf" -#define CONFIG_FILE_TEMP_PATH CONFIG_FILE_PATH ".tmp" -#define CONFIG_FILE_ORIG_PATH CONFIG_FILE_PATH ".orig" -#define CONFIG_FILE_PATH_PREVIOUS EXT_PATH("apps/Misc") "/totp.conf" struct ConfigFileContext { /** @@ -120,26 +117,6 @@ static bool totp_open_config_file(Storage* storage, FlipperFormat** file) { totp_close_config_file(fff_data_file); return false; } - } else if(storage_common_stat(storage, CONFIG_FILE_PATH_PREVIOUS, NULL) == FSE_OK) { - FURI_LOG_D(LOGGING_TAG, "Old config file %s found", CONFIG_FILE_PATH_PREVIOUS); - if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) { - FURI_LOG_D( - LOGGING_TAG, - "Directory %s doesn't exist. Will create new.", - CONFIG_FILE_DIRECTORY_PATH); - if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) { - FURI_LOG_E(LOGGING_TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH); - totp_close_config_file(fff_data_file); - return false; - } - } - if(storage_common_rename(storage, CONFIG_FILE_PATH_PREVIOUS, CONFIG_FILE_PATH) != FSE_OK) { - FURI_LOG_E(LOGGING_TAG, "Error moving config to %s", CONFIG_FILE_PATH); - totp_close_config_file(fff_data_file); - return false; - } - FURI_LOG_I(LOGGING_TAG, "Applied config file path migration"); - return totp_open_config_file(storage, file); } else { FURI_LOG_D(LOGGING_TAG, "Config file %s is not found. Will create new.", CONFIG_FILE_PATH); if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) { @@ -177,9 +154,8 @@ static bool totp_open_config_file(Storage* storage, FlipperFormat** file) { flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1); - // Default Font = 0 tmp_uint32 = 0; - flipper_format_write_uint32(fff_data_file, TOTP_CONFIG_KEY_SELECTED_FONT, &tmp_uint32, 1); + flipper_format_write_uint32(fff_data_file, TOTP_CONFIG_KEY_FONT, &tmp_uint32, 1); if(!flipper_format_rewind(fff_data_file)) { totp_close_config_file(fff_data_file); @@ -263,24 +239,6 @@ bool totp_config_file_update_automation_method(const PluginState* plugin_state) return update_result; } -bool totp_config_file_update_selected_font(const PluginState* plugin_state) { - FlipperFormat* file = plugin_state->config_file_context->config_file; - flipper_format_rewind(file); - bool update_result = false; - - do { - uint32_t tmp_uint32 = plugin_state->selected_font; - if(!flipper_format_insert_or_update_uint32( - file, TOTP_CONFIG_KEY_SELECTED_FONT, &tmp_uint32, 1)) { - break; - } - - update_result = true; - } while(false); - - return update_result; -} - bool totp_config_file_update_user_settings(const PluginState* plugin_state) { FlipperFormat* file = plugin_state->config_file_context->config_file; flipper_format_rewind(file); @@ -302,9 +260,8 @@ bool totp_config_file_update_user_settings(const PluginState* plugin_state) { break; } - tmp_uint32 = plugin_state->selected_font; - if(!flipper_format_insert_or_update_uint32( - file, TOTP_CONFIG_KEY_SELECTED_FONT, &tmp_uint32, 1)) { + tmp_uint32 = plugin_state->active_font_index; + if(!flipper_format_insert_or_update_uint32(file, TOTP_CONFIG_KEY_FONT, &tmp_uint32, 1)) { break; } @@ -456,15 +413,11 @@ bool totp_config_file_load(PluginState* const plugin_state) { plugin_state->automation_method = tmp_uint32; - // Load selected font - flipper_format_rewind(fff_data_file); - - if(!flipper_format_read_uint32( - fff_data_file, TOTP_CONFIG_KEY_SELECTED_FONT, &tmp_uint32, 1)) { + if(!flipper_format_read_uint32(fff_data_file, TOTP_CONFIG_KEY_FONT, &tmp_uint32, 1)) { tmp_uint32 = 0; } - plugin_state->selected_font = tmp_uint32; + plugin_state->active_font_index = tmp_uint32; plugin_state->config_file_context = malloc(sizeof(ConfigFileContext)); furi_check(plugin_state->config_file_context != NULL); diff --git a/applications/external/totp/services/config/config.h b/applications/external/totp/services/config/config.h index cc278ab5a..d2fe957c6 100644 --- a/applications/external/totp/services/config/config.h +++ b/applications/external/totp/services/config/config.h @@ -44,13 +44,6 @@ bool totp_config_file_update_notification_method(const PluginState* plugin_state */ bool totp_config_file_update_automation_method(const PluginState* plugin_state); -/** - * @brief Updates selected font in an application config file - * @param plugin_state application state - * @return Config file update result - */ -bool totp_config_file_update_selected_font(const PluginState* plugin_state); - /** * @brief Updates application user settings * @param plugin_state application state diff --git a/applications/external/totp/services/config/constants.h b/applications/external/totp/services/config/constants.h index 27a4f56c4..ba6658fb5 100644 --- a/applications/external/totp/services/config/constants.h +++ b/applications/external/totp/services/config/constants.h @@ -4,7 +4,7 @@ #define CONFIG_FILE_DIRECTORY_PATH EXT_PATH("authenticator") #define CONFIG_FILE_HEADER "Flipper TOTP plugin config file" -#define CONFIG_FILE_ACTUAL_VERSION (5) +#define CONFIG_FILE_ACTUAL_VERSION (6) #define TOTP_CONFIG_KEY_TIMEZONE "Timezone" #define TOTP_CONFIG_KEY_TOKEN_NAME "TokenName" @@ -18,4 +18,4 @@ #define TOTP_CONFIG_KEY_PINSET "PinIsSet" #define TOTP_CONFIG_KEY_NOTIFICATION_METHOD "NotificationMethod" #define TOTP_CONFIG_KEY_AUTOMATION_METHOD "AutomationMethod" -#define TOTP_CONFIG_KEY_SELECTED_FONT "SelectedFont" +#define TOTP_CONFIG_KEY_FONT "Font" diff --git a/applications/external/totp/services/config/migrations/common_migration.c b/applications/external/totp/services/config/migrations/common_migration.c index 9cee422a5..e8537da0b 100644 --- a/applications/external/totp/services/config/migrations/common_migration.c +++ b/applications/external/totp/services/config/migrations/common_migration.c @@ -58,11 +58,12 @@ bool totp_config_migrate_to_latest( flipper_format_rewind(fff_backup_data_file); - // Font - - if(flipper_format_read_string( - fff_backup_data_file, TOTP_CONFIG_KEY_SELECTED_FONT, temp_str)) { - flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_SELECTED_FONT, temp_str); + if(flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_FONT, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_FONT, temp_str); + } else { + uint32_t default_font_index = 0; + flipper_format_write_uint32( + fff_data_file, TOTP_CONFIG_KEY_FONT, &default_font_index, 1); } flipper_format_rewind(fff_backup_data_file); @@ -84,13 +85,13 @@ bool totp_config_migrate_to_latest( fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_ALGO, temp_str); if(current_version < 5) { - uint32_t algo_as_uint32t = SHA1; - if(furi_string_cmpi_str(temp_str, TOTP_TOKEN_ALGO_SHA256_NAME) == 0) { - algo_as_uint32t = SHA256; - } else if(furi_string_cmpi_str(temp_str, TOTP_TOKEN_ALGO_SHA512_NAME) == 0) { - algo_as_uint32t = SHA512; - } else if(furi_string_cmpi_str(temp_str, TOTP_TOKEN_ALGO_STEAM_NAME) == 0) { - algo_as_uint32t = STEAM; + uint32_t algo_as_uint32t = TokenHashAlgoDefault; + if(furi_string_cmpi_str(temp_str, TOKEN_HASH_ALGO_SHA256_NAME) == 0) { + algo_as_uint32t = TokenHashAlgoSha256; + } else if(furi_string_cmpi_str(temp_str, TOKEN_HASH_ALGO_SHA512_NAME) == 0) { + algo_as_uint32t = TokenHashAlgoSha512; + } else if(furi_string_cmpi_str(temp_str, TOKEN_HASH_ALGO_STEAM_NAME) == 0) { + algo_as_uint32t = TokenHashAlgoSteam; } flipper_format_write_uint32( @@ -104,10 +105,10 @@ bool totp_config_migrate_to_latest( fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, temp_str); flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, temp_str); } else { - const uint32_t default_algo = SHA1; + const uint32_t default_algo = TokenHashAlgoDefault; flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_TOKEN_ALGO, &default_algo, 1); - const uint32_t default_digits = TotpSixDigitsCount; + const uint32_t default_digits = TokenDigitsCountSix; flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, &default_digits, 1); } @@ -118,7 +119,7 @@ bool totp_config_migrate_to_latest( flipper_format_write_string( fff_data_file, TOTP_CONFIG_KEY_TOKEN_DURATION, temp_str); } else { - const uint32_t default_duration = TOTP_TOKEN_DURATION_DEFAULT; + const uint32_t default_duration = TokenDurationDefault; flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_TOKEN_DURATION, &default_duration, 1); } diff --git a/applications/external/totp/services/config/token_info_iterator.c b/applications/external/totp/services/config/token_info_iterator.c index f8cd3c64e..1f4a75776 100644 --- a/applications/external/totp/services/config/token_info_iterator.c +++ b/applications/external/totp/services/config/token_info_iterator.c @@ -496,19 +496,19 @@ bool totp_token_info_iterator_go_to(TokenInfoIteratorContext* context, size_t to if(!flipper_format_read_uint32( context->config_file, TOTP_CONFIG_KEY_TOKEN_ALGO, &temp_data32, 1) || !token_info_set_algo_from_int(tokenInfo, temp_data32)) { - tokenInfo->algo = SHA1; + tokenInfo->algo = TokenHashAlgoDefault; } if(!flipper_format_read_uint32( context->config_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, &temp_data32, 1) || !token_info_set_digits_from_int(tokenInfo, temp_data32)) { - tokenInfo->digits = TotpSixDigitsCount; + tokenInfo->digits = TokenDigitsCountSix; } if(!flipper_format_read_uint32( context->config_file, TOTP_CONFIG_KEY_TOKEN_DURATION, &temp_data32, 1) || !token_info_set_duration_from_int(tokenInfo, temp_data32)) { - tokenInfo->duration = TOTP_TOKEN_DURATION_DEFAULT; + tokenInfo->duration = TokenDurationDefault; } if(flipper_format_read_uint32( diff --git a/applications/external/totp/services/crypto/crypto.c b/applications/external/totp/services/crypto/crypto.c index 8c20fe785..95ddc3210 100644 --- a/applications/external/totp/services/crypto/crypto.c +++ b/applications/external/totp/services/crypto/crypto.c @@ -90,11 +90,8 @@ CryptoSeedIVResult } else { max_i = uid_size; } -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW - const uint8_t* uid = furi_hal_version_uid_default(); -#else - const uint8_t* uid = furi_hal_version_uid(); -#endif + + const uint8_t* uid = (const uint8_t*)UID64_BASE; //-V566 for(uint8_t i = 0; i < max_i; i++) { plugin_state->iv[i] = plugin_state->iv[i] ^ uid[i]; } @@ -137,4 +134,4 @@ bool totp_crypto_verify_key(const PluginState* plugin_state) { free(decrypted_key); return key_valid; -} +} \ No newline at end of file diff --git a/applications/external/totp/services/idle_timeout/idle_timeout.c b/applications/external/totp/services/idle_timeout/idle_timeout.c index 9df1b5487..66369eb93 100644 --- a/applications/external/totp/services/idle_timeout/idle_timeout.c +++ b/applications/external/totp/services/idle_timeout/idle_timeout.c @@ -63,4 +63,4 @@ void idle_timeout_free(IdleTimeoutContext* context) { furi_timer_stop(context->timer); furi_timer_free(context->timer); free(context); -} +} \ No newline at end of file diff --git a/applications/external/totp/services/idle_timeout/idle_timeout.h b/applications/external/totp/services/idle_timeout/idle_timeout.h index 12825e454..5e2359876 100644 --- a/applications/external/totp/services/idle_timeout/idle_timeout.h +++ b/applications/external/totp/services/idle_timeout/idle_timeout.h @@ -41,4 +41,4 @@ void idle_timeout_report_activity(IdleTimeoutContext* context); * @brief Disposes IDLE timeout and releases all the resources * @param context IDLE timeout context */ -void idle_timeout_free(IdleTimeoutContext* context); +void idle_timeout_free(IdleTimeoutContext* context); \ No newline at end of file diff --git a/applications/external/totp/totp_app.c b/applications/external/totp/totp_app.c index 642e27c61..bdd202067 100644 --- a/applications/external/totp/totp_app.c +++ b/applications/external/totp/totp_app.c @@ -116,7 +116,6 @@ static bool on_user_idle(void* context) { } static bool totp_plugin_state_init(PluginState* const plugin_state) { - plugin_state->selected_font = 0; plugin_state->gui = furi_record_open(RECORD_GUI); plugin_state->notification_app = furi_record_open(RECORD_NOTIFICATION); plugin_state->dialogs_app = furi_record_open(RECORD_DIALOGS); diff --git a/applications/external/totp/types/plugin_state.h b/applications/external/totp/types/plugin_state.h index 234894d58..87ed51abd 100644 --- a/applications/external/totp/types/plugin_state.h +++ b/applications/external/totp/types/plugin_state.h @@ -84,11 +84,6 @@ typedef struct { */ NotificationMethod notification_method; - /** - * @brief Numbers Font - */ - uint8_t selected_font; - /** * @brief Main rendering loop mutex */ @@ -110,4 +105,9 @@ typedef struct { * @brief IDLE timeout context */ IdleTimeoutContext* idle_timeout_context; + + /** + * @brief Font index to be used to draw TOTP token + */ + uint8_t active_font_index; } PluginState; diff --git a/applications/external/totp/types/token_info.c b/applications/external/totp/types/token_info.c index 6810d0211..ab47f4e3e 100644 --- a/applications/external/totp/types/token_info.c +++ b/applications/external/totp/types/token_info.c @@ -69,13 +69,13 @@ bool token_info_set_secret( bool token_info_set_digits_from_int(TokenInfo* token_info, uint8_t digits) { switch(digits) { case 5: - token_info->digits = TotpFiveDigitsCount; + token_info->digits = TokenDigitsCountFive; return true; case 6: - token_info->digits = TotpSixDigitsCount; + token_info->digits = TokenDigitsCountSix; return true; case 8: - token_info->digits = TotpEightDigitsCount; + token_info->digits = TokenDigitsCountEight; return true; default: break; @@ -85,32 +85,35 @@ bool token_info_set_digits_from_int(TokenInfo* token_info, uint8_t digits) { } bool token_info_set_duration_from_int(TokenInfo* token_info, uint8_t duration) { - if(duration >= 15) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" + if(duration >= TokenDurationMin && duration <= TokenDurationMax) { //-V560 token_info->duration = duration; return true; } +#pragma GCC diagnostic pop return false; } bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str) { - if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA1_NAME) == 0) { - token_info->algo = SHA1; + if(furi_string_cmpi_str(str, TOKEN_HASH_ALGO_SHA1_NAME) == 0) { + token_info->algo = TokenHashAlgoSha1; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA256_NAME) == 0) { - token_info->algo = SHA256; + if(furi_string_cmpi_str(str, TOKEN_HASH_ALGO_SHA256_NAME) == 0) { + token_info->algo = TokenHashAlgoSha256; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_SHA512_NAME) == 0) { - token_info->algo = SHA512; + if(furi_string_cmpi_str(str, TOKEN_HASH_ALGO_SHA512_NAME) == 0) { + token_info->algo = TokenHashAlgoSha512; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_ALGO_STEAM_NAME) == 0) { - token_info->algo = STEAM; + if(furi_string_cmpi_str(str, TOKEN_HASH_ALGO_STEAM_NAME) == 0) { + token_info->algo = TokenHashAlgoSteam; return true; } @@ -119,17 +122,17 @@ bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str) bool token_info_set_algo_from_int(TokenInfo* token_info, uint8_t algo_code) { switch(algo_code) { - case SHA1: - token_info->algo = SHA1; + case TokenHashAlgoSha1: + token_info->algo = TokenHashAlgoSha1; break; - case SHA256: - token_info->algo = SHA256; + case TokenHashAlgoSha256: + token_info->algo = TokenHashAlgoSha256; break; - case SHA512: - token_info->algo = SHA512; + case TokenHashAlgoSha512: + token_info->algo = TokenHashAlgoSha512; break; - case STEAM: - token_info->algo = STEAM; + case TokenHashAlgoSteam: + token_info->algo = TokenHashAlgoSteam; break; default: return false; @@ -138,16 +141,16 @@ bool token_info_set_algo_from_int(TokenInfo* token_info, uint8_t algo_code) { return true; } -char* token_info_get_algo_as_cstr(const TokenInfo* token_info) { +const char* token_info_get_algo_as_cstr(const TokenInfo* token_info) { switch(token_info->algo) { - case SHA1: - return TOTP_TOKEN_ALGO_SHA1_NAME; - case SHA256: - return TOTP_TOKEN_ALGO_SHA256_NAME; - case SHA512: - return TOTP_TOKEN_ALGO_SHA512_NAME; - case STEAM: - return TOTP_TOKEN_ALGO_STEAM_NAME; + case TokenHashAlgoSha1: + return TOKEN_HASH_ALGO_SHA1_NAME; + case TokenHashAlgoSha256: + return TOKEN_HASH_ALGO_SHA256_NAME; + case TokenHashAlgoSha512: + return TOKEN_HASH_ALGO_SHA512_NAME; + case TokenHashAlgoSteam: + return TOKEN_HASH_ALGO_STEAM_NAME; default: break; } @@ -156,22 +159,22 @@ char* token_info_get_algo_as_cstr(const TokenInfo* token_info) { } bool token_info_set_automation_feature_from_str(TokenInfo* token_info, const FuriString* str) { - if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME) == 0) { + if(furi_string_cmpi_str(str, TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME) == 0) { token_info->automation_features |= TokenAutomationFeatureEnterAtTheEnd; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME) == 0) { + if(furi_string_cmpi_str(str, TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME) == 0) { token_info->automation_features |= TokenAutomationFeatureTabAtTheEnd; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME) == 0) { + if(furi_string_cmpi_str(str, TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME) == 0) { token_info->automation_features |= TokenAutomationFeatureTypeSlower; return true; } - if(furi_string_cmpi_str(str, TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME) == 0) { + if(furi_string_cmpi_str(str, TOKEN_AUTOMATION_FEATURE_NONE_NAME) == 0) { token_info->automation_features = TokenAutomationFeatureNone; return true; } @@ -195,9 +198,9 @@ TokenInfo* token_info_clone(const TokenInfo* src) { void token_info_set_defaults(TokenInfo* token_info) { furi_check(token_info != NULL); - token_info->algo = SHA1; - token_info->digits = TotpSixDigitsCount; - token_info->duration = TOTP_TOKEN_DURATION_DEFAULT; + token_info->algo = TokenHashAlgoDefault; + token_info->digits = TokenDigitsCountDefault; + token_info->duration = TokenDurationDefault; token_info->automation_features = TokenAutomationFeatureNone; furi_string_reset(token_info->name); } \ No newline at end of file diff --git a/applications/external/totp/types/token_info.h b/applications/external/totp/types/token_info.h index 0d73dd061..163a0492e 100644 --- a/applications/external/totp/types/token_info.h +++ b/applications/external/totp/types/token_info.h @@ -4,26 +4,20 @@ #include #include -#define TOTP_TOKEN_DURATION_DEFAULT (30) - -#define TOTP_TOKEN_ALGO_SHA1_NAME "sha1" -#define TOTP_TOKEN_ALGO_STEAM_NAME "steam" -#define TOTP_TOKEN_ALGO_SHA256_NAME "sha256" -#define TOTP_TOKEN_ALGO_SHA512_NAME "sha512" -#define TOTP_TOKEN_MAX_LENGTH (255) - +#define TOKEN_HASH_ALGO_SHA1_NAME "sha1" +#define TOKEN_HASH_ALGO_STEAM_NAME "steam" +#define TOKEN_HASH_ALGO_SHA256_NAME "sha256" +#define TOKEN_HASH_ALGO_SHA512_NAME "sha512" #define PLAIN_TOKEN_ENCODING_BASE32_NAME "base32" #define PLAIN_TOKEN_ENCODING_BASE64_NAME "base64" - -#define TOTP_TOKEN_AUTOMATION_FEATURE_NONE_NAME "none" -#define TOTP_TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME "enter" -#define TOTP_TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME "tab" -#define TOTP_TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME "slower" - -#define TOTP_TOKEN_DIGITS_MAX_COUNT (8) +#define TOKEN_AUTOMATION_FEATURE_NONE_NAME "none" +#define TOKEN_AUTOMATION_FEATURE_ENTER_AT_THE_END_NAME "enter" +#define TOKEN_AUTOMATION_FEATURE_TAB_AT_THE_END_NAME "tab" +#define TOKEN_AUTOMATION_FEATURE_TYPE_SLOWER_NAME "slower" typedef uint8_t TokenHashAlgo; typedef uint8_t TokenDigitsCount; +typedef uint8_t TokenDuration; typedef uint8_t TokenAutomationFeature; typedef uint8_t PlainTokenSecretEncoding; @@ -34,22 +28,27 @@ enum TokenHashAlgos { /** * @brief SHA1 hashing algorithm */ - SHA1 = 0, + TokenHashAlgoSha1 = 0, /** * @brief SHA256 hashing algorithm */ - SHA256 = 1, + TokenHashAlgoSha256 = 1, /** * @brief SHA512 hashing algorithm */ - SHA512 = 2, + TokenHashAlgoSha512 = 2, /** * @brief Algorithm used by Steam (Valve) */ - STEAM = 3 + TokenHashAlgoSteam = 3, + + /** + * @brief Default token hashing algorithm + */ + TokenHashAlgoDefault = TokenHashAlgoSha1 }; /** @@ -59,17 +58,47 @@ enum TokenDigitsCounts { /** * @brief 5 digits */ - TotpFiveDigitsCount = 5, + TokenDigitsCountFive = 5, /** * @brief 6 digits */ - TotpSixDigitsCount = 6, + TokenDigitsCountSix = 6, /** * @brief 8 digits */ - TotpEightDigitsCount = 8 + TokenDigitsCountEight = 8, + + /** + * @brief Default digits count + */ + TokenDigitsCountDefault = TokenDigitsCountSix, + + /** + * @brief Maximum digits count + */ + TokenDigitsCountMax = TokenDigitsCountEight +}; + +/** + * @brief Token durations + */ +enum TokenDurations { + /** + * @brief Default token duration + */ + TokenDurationDefault = 30, + + /** + * @brief Minimum token duration + */ + TokenDurationMin = 15, + + /** + * @brief Maximum token duration + */ + TokenDurationMax = UINT8_MAX }; /** @@ -145,7 +174,7 @@ typedef struct { /** * @brief Desired TOTP token duration in seconds */ - uint8_t duration; + TokenDuration duration; /** * @brief Token input automation features @@ -218,7 +247,7 @@ bool token_info_set_algo_from_int(TokenInfo* token_info, uint8_t algo_code); * @param token_info instance which token hahsing algorithm name should be returned * @return token hashing algorithm name as C-string */ -char* token_info_get_algo_as_cstr(const TokenInfo* token_info); +const char* token_info_get_algo_as_cstr(const TokenInfo* token_info); /** * @brief Sets token automation feature from \c str value diff --git a/applications/external/totp/ui/canvas_extensions.c b/applications/external/totp/ui/canvas_extensions.c new file mode 100644 index 000000000..d3f044b77 --- /dev/null +++ b/applications/external/totp/ui/canvas_extensions.c @@ -0,0 +1,33 @@ +#include "canvas_extensions.h" + +void canvas_draw_str_ex( + Canvas* canvas, + uint8_t x, + uint8_t y, + const char* text, + size_t text_length, + const FONT_INFO* const font) { + const char* p_ch = text; + char ch; + size_t i = 0; + uint8_t offset_x = x; + uint8_t char_width = font->charInfo[0].width; + uint8_t offset_x_inc = char_width + font->spacePixels; + while(i < text_length && (ch = *p_ch) != 0) { + if(ch >= font->startChar && ch <= font->endChar) { + uint8_t char_index = ch - font->startChar; + canvas_draw_xbm( + canvas, + offset_x, + y, + char_width, + font->height, + &font->data[font->charInfo[char_index].offset]); + } + + offset_x += offset_x_inc; + + p_ch++; + i++; + } +} \ No newline at end of file diff --git a/applications/external/totp/ui/canvas_extensions.h b/applications/external/totp/ui/canvas_extensions.h new file mode 100644 index 000000000..ab5519140 --- /dev/null +++ b/applications/external/totp/ui/canvas_extensions.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include +#include + +void canvas_draw_str_ex( + Canvas* canvas, + uint8_t x, + uint8_t y, + const char* text, + size_t text_length, + const FONT_INFO* const font); \ No newline at end of file diff --git a/applications/external/totp/ui/fonts/active_font.h b/applications/external/totp/ui/fonts/active_font.h deleted file mode 100644 index c873ce200..000000000 --- a/applications/external/totp/ui/fonts/active_font.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "../../features_config.h" -#include "font_info.h" - -#include "mode_nine/mode_nine.h" -#include "redhat_mono/redhat_mono.h" -#include "bedstead/bedstead.h" -#include "zector/zector.h" -#include "712serif/712serif.h" -#include "graph35pix/graph35pix.h" -#include "karma_future/karma_future.h" -#include "funclimbing/funclimbing.h" -#include "dpcomic/dpcomic.h" -#include "pixelflag/pixelflag.h" diff --git a/applications/external/totp/ui/scenes/add_new_token/totp_input_text.c b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.c index 5eb1231d9..95aa4fbaa 100644 --- a/applications/external/totp/ui/scenes/add_new_token/totp_input_text.c +++ b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.c @@ -1,81 +1,52 @@ #include "totp_input_text.h" -#include -void view_draw(View* view, Canvas* canvas) { - furi_assert(view); - if(view->draw_callback) { - void* data = view_get_model(view); - view->draw_callback(canvas, data); - view_unlock_model(view); - } +#include +#include + +typedef struct { + InputTextResult* result; + ViewDispatcher* view_dispatcher; +} InputTextContext; + +static void commit_text_input_callback(void* ctx) { + InputTextContext* context = ctx; + context->result->user_input_length = strnlen(context->result->user_input, INPUT_BUFFER_SIZE); + context->result->success = true; + view_dispatcher_stop(context->view_dispatcher); } -bool view_input(View* view, InputEvent* event) { - furi_assert(view); - if(view->input_callback) { - return view->input_callback(event, view->context); - } else { - return false; - } +static bool back_event_callback(void* ctx) { + InputTextContext* context = ctx; + context->result->success = false; + view_dispatcher_stop(context->view_dispatcher); + return false; } -void view_unlock_model(View* view) { - furi_assert(view); - if(view->model_type == ViewModelTypeLocking) { - ViewModelLocking* model = (ViewModelLocking*)(view->model); - furi_check(furi_mutex_release(model->mutex) == FuriStatusOk); - } -} - -static void commit_text_input_callback(void* context) { - InputTextSceneState* text_input_state = (InputTextSceneState*)context; - if(text_input_state->callback != NULL) { - InputTextSceneCallbackResult* result = malloc(sizeof(InputTextSceneCallbackResult)); - furi_check(result != NULL); - result->user_input_length = - strnlen(text_input_state->text_input_buffer, INPUT_BUFFER_SIZE); - result->user_input = malloc(result->user_input_length + 1); - furi_check(result->user_input != NULL); - result->callback_data = text_input_state->callback_data; - strlcpy( - result->user_input, - text_input_state->text_input_buffer, - result->user_input_length + 1); - text_input_state->callback(result); - } -} - -InputTextSceneState* totp_input_text_activate(InputTextSceneContext* context) { - InputTextSceneState* text_input_state = malloc(sizeof(InputTextSceneState)); - furi_check(text_input_state != NULL); - text_input_state->text_input = text_input_alloc(); - text_input_state->text_input_view = text_input_get_view(text_input_state->text_input); - text_input_state->callback = context->callback; - text_input_state->callback_data = context->callback_data; - text_input_set_header_text(text_input_state->text_input, context->header_text); +void totp_input_text(Gui* gui, const char* header_text, InputTextResult* result) { + ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); + TextInput* text_input = text_input_alloc(); + InputTextContext context = {.result = result, .view_dispatcher = view_dispatcher}; + text_input_set_header_text(text_input, header_text); text_input_set_result_callback( - text_input_state->text_input, + text_input, commit_text_input_callback, - text_input_state, - &text_input_state->text_input_buffer[0], + &context, + result->user_input, INPUT_BUFFER_SIZE, true); - return text_input_state; -} -void totp_input_text_render(Canvas* const canvas, InputTextSceneState* text_input_state) { - view_draw(text_input_state->text_input_view, canvas); -} + view_dispatcher_enable_queue(view_dispatcher); + view_dispatcher_add_view(view_dispatcher, 0, text_input_get_view(text_input)); -bool totp_input_text_handle_event(PluginEvent* const event, InputTextSceneState* text_input_state) { - if(event->type == EventTypeKey) { - view_input(text_input_state->text_input_view, &event->input); - } + view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); - return true; -} + view_dispatcher_set_navigation_event_callback(view_dispatcher, &back_event_callback); + view_dispatcher_set_event_callback_context(view_dispatcher, &context); + view_dispatcher_switch_to_view(view_dispatcher, 0); -void totp_input_text_free(InputTextSceneState* state) { - text_input_free(state->text_input); - free(state); + view_dispatcher_run(view_dispatcher); + + view_dispatcher_remove_view(view_dispatcher, 0); + view_dispatcher_free(view_dispatcher); + text_input_free(text_input); } diff --git a/applications/external/totp/ui/scenes/add_new_token/totp_input_text.h b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.h index ffbfde692..7ec116a9b 100644 --- a/applications/external/totp/ui/scenes/add_new_token/totp_input_text.h +++ b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.h @@ -1,36 +1,13 @@ #pragma once #include -#include -#include -#include "../../../types/plugin_state.h" -#include "../../../types/plugin_event.h" #define INPUT_BUFFER_SIZE (255) typedef struct { - char* user_input; + char user_input[INPUT_BUFFER_SIZE]; size_t user_input_length; - void* callback_data; -} InputTextSceneCallbackResult; + bool success; +} InputTextResult; -typedef void (*InputTextSceneCallback)(InputTextSceneCallbackResult* result); - -typedef struct { - InputTextSceneCallback callback; - char* header_text; - void* callback_data; -} InputTextSceneContext; - -typedef struct { - TextInput* text_input; - View* text_input_view; - char text_input_buffer[INPUT_BUFFER_SIZE]; - InputTextSceneCallback callback; - void* callback_data; -} InputTextSceneState; - -InputTextSceneState* totp_input_text_activate(InputTextSceneContext* context); -void totp_input_text_render(Canvas* const canvas, InputTextSceneState* text_input_state); -bool totp_input_text_handle_event(PluginEvent* const event, InputTextSceneState* text_input_state); -void totp_input_text_free(InputTextSceneState* state); +void totp_input_text(Gui* gui, const char* header_text, InputTextResult* result); diff --git a/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c index 327185cf7..6856d1e30 100644 --- a/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c +++ b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c @@ -13,9 +13,9 @@ char* TOKEN_ALGO_LIST[] = {"SHA1", "SHA256", "SHA512", "Steam"}; char* TOKEN_DIGITS_TEXT_LIST[] = {"5 digits", "6 digits", "8 digits"}; TokenDigitsCount TOKEN_DIGITS_VALUE_LIST[] = { - TotpFiveDigitsCount, - TotpSixDigitsCount, - TotpEightDigitsCount}; + TokenDigitsCountFive, + TokenDigitsCountSix, + TokenDigitsCountEight}; typedef enum { TokenNameTextBox, @@ -33,10 +33,6 @@ typedef struct { size_t token_secret_length; bool saved; Control selected_control; - InputTextSceneContext* token_name_input_context; - InputTextSceneContext* token_secret_input_context; - InputTextSceneState* input_state; - bool text_input_mode; int16_t screen_y_offset; TokenHashAlgo algo; uint8_t digits_count_index; @@ -51,24 +47,6 @@ struct TotpAddContext { enum TotpIteratorUpdateTokenResultsEx { TotpIteratorUpdateTokenResultInvalidSecret = 1 }; -static void on_token_name_user_comitted(InputTextSceneCallbackResult* result) { - SceneState* scene_state = result->callback_data; - free(scene_state->token_name); - scene_state->token_name = result->user_input; - scene_state->token_name_length = result->user_input_length; - scene_state->text_input_mode = false; - free(result); -} - -static void on_token_secret_user_comitted(InputTextSceneCallbackResult* result) { - SceneState* scene_state = result->callback_data; - free(scene_state->token_secret); - scene_state->token_secret = result->user_input; - scene_state->token_secret_length = result->user_input_length; - scene_state->text_input_mode = false; - free(result); -} - static void update_duration_text(SceneState* scene_state) { furi_string_printf(scene_state->duration_text, "%d sec.", scene_state->duration); } @@ -95,6 +73,26 @@ static TotpIteratorUpdateTokenResult add_token_handler(TokenInfo* tokenInfo, con return TotpIteratorUpdateTokenResultSuccess; } +static void ask_user_input( + const PluginState* plugin_state, + const char* header, + char** user_input, + size_t* user_input_length) { + InputTextResult input_result; + if(*user_input != NULL) { + strlcpy(input_result.user_input, *user_input, INPUT_BUFFER_SIZE); + } + + totp_input_text(plugin_state->gui, header, &input_result); + if(input_result.success) { + if(*user_input != NULL) { + free(*user_input); + } + *user_input = strdup(input_result.user_input); + *user_input_length = input_result.user_input_length; + } +} + void totp_scene_add_new_token_activate(PluginState* plugin_state) { SceneState* scene_state = malloc(sizeof(SceneState)); furi_check(scene_state != NULL); @@ -104,34 +102,17 @@ void totp_scene_add_new_token_activate(PluginState* plugin_state) { scene_state->token_secret = "Secret"; scene_state->token_secret_length = strlen(scene_state->token_secret); - scene_state->token_name_input_context = malloc(sizeof(InputTextSceneContext)); - furi_check(scene_state->token_name_input_context != NULL); - scene_state->token_name_input_context->header_text = "Enter token name"; - scene_state->token_name_input_context->callback_data = scene_state; - scene_state->token_name_input_context->callback = on_token_name_user_comitted; - - scene_state->token_secret_input_context = malloc(sizeof(InputTextSceneContext)); - furi_check(scene_state->token_secret_input_context != NULL); - scene_state->token_secret_input_context->header_text = "Enter token secret"; - scene_state->token_secret_input_context->callback_data = scene_state; - scene_state->token_secret_input_context->callback = on_token_secret_user_comitted; - scene_state->screen_y_offset = 0; scene_state->digits_count_index = 1; - scene_state->input_state = NULL; - scene_state->duration = TOTP_TOKEN_DURATION_DEFAULT; + scene_state->duration = TokenDurationDefault; scene_state->duration_text = furi_string_alloc(); update_duration_text(scene_state); } -void totp_scene_add_new_token_render(Canvas* const canvas, PluginState* plugin_state) { - SceneState* scene_state = plugin_state->current_scene_state; - if(scene_state->text_input_mode) { - totp_input_text_render(canvas, scene_state->input_state); - return; - } +void totp_scene_add_new_token_render(Canvas* const canvas, const PluginState* plugin_state) { + const SceneState* scene_state = plugin_state->current_scene_state; ui_control_text_box_render( canvas, @@ -195,31 +176,15 @@ void update_screen_y_offset(SceneState* scene_state) { } } -bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState* plugin_state) { +bool totp_scene_add_new_token_handle_event( + const PluginEvent* const event, + PluginState* plugin_state) { if(event->type != EventTypeKey) { return true; } SceneState* scene_state = plugin_state->current_scene_state; - if(event->input.type == InputTypeLong && event->input.key == InputKeyBack) { - if(scene_state->text_input_mode) { - scene_state->text_input_mode = false; - } else { - return false; - } - } - - if(scene_state->text_input_mode) { - if(event->input.type == InputTypeShort && event->input.key == InputKeyBack) { - PluginEvent long_back_cb_evt = { - .type = event->type, .input.key = InputKeyBack, .input.type = InputTypeLong}; - return totp_input_text_handle_event(&long_back_cb_evt, scene_state->input_state); - } - - return totp_input_text_handle_event(event, scene_state->input_state); - } - if(event->input.type == InputTypePress) { switch(event->input.key) { case InputKeyUp: @@ -243,7 +208,11 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState case InputKeyRight: if(scene_state->selected_control == TokenAlgoSelect) { totp_roll_value_uint8_t( - &scene_state->algo, 1, SHA1, STEAM, RollOverflowBehaviorRoll); + &scene_state->algo, + 1, + TokenHashAlgoSha1, + TokenHashAlgoSteam, + RollOverflowBehaviorRoll); } else if(scene_state->selected_control == TokenLengthSelect) { totp_roll_value_uint8_t( &scene_state->digits_count_index, 1, 0, 2, RollOverflowBehaviorRoll); @@ -256,7 +225,11 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState case InputKeyLeft: if(scene_state->selected_control == TokenAlgoSelect) { totp_roll_value_uint8_t( - &scene_state->algo, -1, SHA1, STEAM, RollOverflowBehaviorRoll); + &scene_state->algo, + -1, + TokenHashAlgoSha1, + TokenHashAlgoSteam, + RollOverflowBehaviorRoll); } else if(scene_state->selected_control == TokenLengthSelect) { totp_roll_value_uint8_t( &scene_state->digits_count_index, -1, 0, 2, RollOverflowBehaviorRoll); @@ -277,22 +250,18 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) { switch(scene_state->selected_control) { case TokenNameTextBox: - if(scene_state->input_state != NULL) { - totp_input_text_free(scene_state->input_state); - } - scene_state->input_state = - totp_input_text_activate(scene_state->token_name_input_context); - - scene_state->text_input_mode = true; + ask_user_input( + plugin_state, + "Token name", + &scene_state->token_name, + &scene_state->token_name_length); break; case TokenSecretTextBox: - if(scene_state->input_state != NULL) { - totp_input_text_free(scene_state->input_state); - } - scene_state->input_state = - totp_input_text_activate(scene_state->token_secret_input_context); - - scene_state->text_input_mode = true; + ask_user_input( + plugin_state, + "Token secret", + &scene_state->token_secret, + &scene_state->token_secret_length); break; case TokenAlgoSelect: break; @@ -344,18 +313,8 @@ void totp_scene_add_new_token_deactivate(PluginState* plugin_state) { free(scene_state->token_name); free(scene_state->token_secret); - free(scene_state->token_name_input_context->header_text); - free(scene_state->token_name_input_context); - - free(scene_state->token_secret_input_context->header_text); - free(scene_state->token_secret_input_context); - furi_string_free(scene_state->duration_text); - if(scene_state->input_state != NULL) { - totp_input_text_free(scene_state->input_state); - } - free(plugin_state->current_scene_state); plugin_state->current_scene_state = NULL; } diff --git a/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h index dd6b32994..7297869d0 100644 --- a/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h +++ b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h @@ -5,6 +5,8 @@ #include "../../../types/plugin_event.h" void totp_scene_add_new_token_activate(PluginState* plugin_state); -void totp_scene_add_new_token_render(Canvas* const canvas, PluginState* plugin_state); -bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState* plugin_state); +void totp_scene_add_new_token_render(Canvas* const canvas, const PluginState* plugin_state); +bool totp_scene_add_new_token_handle_event( + const PluginEvent* const event, + PluginState* plugin_state); void totp_scene_add_new_token_deactivate(PluginState* plugin_state); diff --git a/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c b/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c index bf76b7c82..7575d0f2d 100644 --- a/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c +++ b/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c @@ -1,6 +1,8 @@ #include "totp_app_settings.h" #include #include +#include +#include "../../canvas_extensions.h" #include "../../ui_controls.h" #include "../../common_dialogs.h" #include "../../scene_director.h" @@ -14,18 +16,20 @@ #include "../../../workers/bt_type_code/bt_type_code.h" #endif -char* YES_NO_LIST[] = {"NO", "YES"}; -char* ON_OFF_LIST[] = {"OFF", "ON"}; +static const char* YES_NO_LIST[] = {"NO", "YES"}; +static const char* ON_OFF_LIST[] = {"OFF", "ON"}; +static const char* FONT_TEST_STR = "0123BCD"; +static const uint8_t FONT_TEST_STR_LENGTH = 7; typedef enum { HoursInput, MinutesInput, - Sound, - Vibro, - FontSelector, - BadUsb, + FontSelect, + SoundSwitch, + VibroSwitch, + BadUsbSwitch, #ifdef TOTP_BADBT_TYPE_ENABLED - BadBt, + BadBtSwitch, #endif ConfirmButton } Control; @@ -35,13 +39,13 @@ typedef struct { uint8_t tz_offset_minutes; bool notification_sound; bool notification_vibro; - uint8_t selected_font; bool badusb_enabled; #ifdef TOTP_BADBT_TYPE_ENABLED bool badbt_enabled; #endif uint8_t y_offset; Control selected_control; + uint8_t active_font; } SceneState; void totp_scene_app_settings_activate(PluginState* plugin_state) { @@ -56,10 +60,10 @@ void totp_scene_app_settings_activate(PluginState* plugin_state) { scene_state->notification_sound = plugin_state->notification_method & NotificationMethodSound; scene_state->notification_vibro = plugin_state->notification_method & NotificationMethodVibro; scene_state->badusb_enabled = plugin_state->automation_method & AutomationMethodBadUsb; - scene_state->selected_font = plugin_state->selected_font; #ifdef TOTP_BADBT_TYPE_ENABLED scene_state->badbt_enabled = plugin_state->automation_method & AutomationMethodBadBt; #endif + scene_state->active_font = plugin_state->active_font_index; } static void two_digit_to_str(int8_t num, char* str) { @@ -113,75 +117,87 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu &I_totp_arrow_bottom_10x5); canvas_set_font(canvas, FontPrimary); - canvas_draw_str_aligned( - canvas, 0, 64 - scene_state->y_offset, AlignLeft, AlignTop, "Notifications / UI"); + canvas_draw_str_aligned(canvas, 0, 64 - scene_state->y_offset, AlignLeft, AlignTop, "Font"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 0, 78 - scene_state->y_offset, AlignLeft, AlignTop, "Sound:"); + const FONT_INFO* const font = available_fonts[scene_state->active_font]; ui_control_select_render( canvas, - 36, - 71 - scene_state->y_offset, - SCREEN_WIDTH - 36, - YES_NO_LIST[scene_state->notification_sound], - scene_state->selected_control == Sound); + 0, + 74 - scene_state->y_offset, + SCREEN_WIDTH, + font->name, + scene_state->selected_control == FontSelect); - canvas_draw_str_aligned(canvas, 0, 94 - scene_state->y_offset, AlignLeft, AlignTop, "Vibro:"); - ui_control_select_render( - canvas, - 36, - 87 - scene_state->y_offset, - SCREEN_WIDTH - 36, - YES_NO_LIST[scene_state->notification_vibro], - scene_state->selected_control == Vibro); - - two_digit_to_str(scene_state->selected_font, &tmp_str[0]); - canvas_draw_str_aligned( - canvas, 0, 110 - scene_state->y_offset, AlignLeft, AlignTop, "UI Font:"); - ui_control_select_render( - canvas, - 36, - 103 - scene_state->y_offset, - SCREEN_WIDTH - 36, - &tmp_str[0], - scene_state->selected_control == FontSelector); + uint8_t font_x_offset = + SCREEN_WIDTH_CENTER - + (((font->charInfo[0].width + font->spacePixels) * FONT_TEST_STR_LENGTH) >> 1); + uint8_t font_y_offset = 108 - scene_state->y_offset - (font->height >> 1); + canvas_draw_str_ex( + canvas, font_x_offset, font_y_offset, FONT_TEST_STR, FONT_TEST_STR_LENGTH, font); canvas_draw_icon( canvas, SCREEN_WIDTH_CENTER - 5, 123 - scene_state->y_offset, &I_totp_arrow_bottom_10x5); canvas_set_font(canvas, FontPrimary); canvas_draw_str_aligned( - canvas, 0, 128 - scene_state->y_offset, AlignLeft, AlignTop, "Automation"); + canvas, 0, 128 - scene_state->y_offset, AlignLeft, AlignTop, "Notifications"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned( - canvas, 0, 145 - scene_state->y_offset, AlignLeft, AlignTop, "BadUSB:"); + canvas_draw_str_aligned(canvas, 0, 145 - scene_state->y_offset, AlignLeft, AlignTop, "Sound:"); ui_control_select_render( canvas, 36, 138 - scene_state->y_offset, SCREEN_WIDTH - 36, - ON_OFF_LIST[scene_state->badusb_enabled], - scene_state->selected_control == BadUsb); + YES_NO_LIST[scene_state->notification_sound], + scene_state->selected_control == SoundSwitch); -#ifdef TOTP_BADBT_TYPE_ENABLED - canvas_draw_str_aligned(canvas, 0, 163 - scene_state->y_offset, AlignLeft, AlignTop, "BadBT:"); + canvas_draw_str_aligned(canvas, 0, 163 - scene_state->y_offset, AlignLeft, AlignTop, "Vibro:"); ui_control_select_render( canvas, 36, 156 - scene_state->y_offset, SCREEN_WIDTH - 36, + YES_NO_LIST[scene_state->notification_vibro], + scene_state->selected_control == VibroSwitch); + + canvas_draw_icon( + canvas, SCREEN_WIDTH_CENTER - 5, 187 - scene_state->y_offset, &I_totp_arrow_bottom_10x5); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, 0, 192 - scene_state->y_offset, AlignLeft, AlignTop, "Automation"); + canvas_set_font(canvas, FontSecondary); + + canvas_draw_str_aligned( + canvas, 0, 209 - scene_state->y_offset, AlignLeft, AlignTop, "BadUSB:"); + ui_control_select_render( + canvas, + 36, + 202 - scene_state->y_offset, + SCREEN_WIDTH - 36, + ON_OFF_LIST[scene_state->badusb_enabled], + scene_state->selected_control == BadUsbSwitch); + +#ifdef TOTP_BADBT_TYPE_ENABLED + canvas_draw_str_aligned(canvas, 0, 227 - scene_state->y_offset, AlignLeft, AlignTop, "BadBT:"); + ui_control_select_render( + canvas, + 36, + 220 - scene_state->y_offset, + SCREEN_WIDTH - 36, ON_OFF_LIST[scene_state->badbt_enabled], - scene_state->selected_control == BadBt); + scene_state->selected_control == BadBtSwitch); #endif ui_control_button_render( canvas, SCREEN_WIDTH_CENTER - 24, #ifdef TOTP_BADBT_TYPE_ENABLED - 178 - scene_state->y_offset, + 242 - scene_state->y_offset, #else - 165 - scene_state->y_offset, + 229 - scene_state->y_offset, #endif 48, 13, @@ -206,10 +222,12 @@ bool totp_scene_app_settings_handle_event( HoursInput, ConfirmButton, RollOverflowBehaviorStop); - if(scene_state->selected_control > FontSelector) { - scene_state->y_offset = 128; + if(scene_state->selected_control > VibroSwitch) { + scene_state->y_offset = SCREEN_HEIGHT * 3; + } else if(scene_state->selected_control > FontSelect) { + scene_state->y_offset = SCREEN_HEIGHT * 2; } else if(scene_state->selected_control > MinutesInput) { - scene_state->y_offset = 64; + scene_state->y_offset = SCREEN_HEIGHT; } else { scene_state->y_offset = 0; } @@ -221,10 +239,12 @@ bool totp_scene_app_settings_handle_event( HoursInput, ConfirmButton, RollOverflowBehaviorStop); - if(scene_state->selected_control > FontSelector) { - scene_state->y_offset = 128; + if(scene_state->selected_control > VibroSwitch) { + scene_state->y_offset = SCREEN_HEIGHT * 3; + } else if(scene_state->selected_control > FontSelect) { + scene_state->y_offset = SCREEN_HEIGHT * 2; } else if(scene_state->selected_control > MinutesInput) { - scene_state->y_offset = 64; + scene_state->y_offset = SCREEN_HEIGHT; } else { scene_state->y_offset = 0; } @@ -236,22 +256,25 @@ bool totp_scene_app_settings_handle_event( } else if(scene_state->selected_control == MinutesInput) { totp_roll_value_uint8_t( &scene_state->tz_offset_minutes, 15, 0, 45, RollOverflowBehaviorRoll); - } else if(scene_state->selected_control == Sound) { + } else if(scene_state->selected_control == FontSelect) { + totp_roll_value_uint8_t( + &scene_state->active_font, + 1, + 0, + AVAILABLE_FONTS_COUNT - 1, + RollOverflowBehaviorRoll); + } else if(scene_state->selected_control == SoundSwitch) { scene_state->notification_sound = !scene_state->notification_sound; - } else if(scene_state->selected_control == Vibro) { + } else if(scene_state->selected_control == VibroSwitch) { scene_state->notification_vibro = !scene_state->notification_vibro; - } else if(scene_state->selected_control == BadUsb) { + } else if(scene_state->selected_control == BadUsbSwitch) { scene_state->badusb_enabled = !scene_state->badusb_enabled; } #ifdef TOTP_BADBT_TYPE_ENABLED - else if(scene_state->selected_control == BadBt) { + else if(scene_state->selected_control == BadBtSwitch) { scene_state->badbt_enabled = !scene_state->badbt_enabled; } #endif - else if(scene_state->selected_control == FontSelector) { - totp_roll_value_uint8_t( - &scene_state->selected_font, 1, 0, MAX_CUSTOM_FONTS, RollOverflowBehaviorStop); - } break; case InputKeyLeft: if(scene_state->selected_control == HoursInput) { @@ -260,22 +283,25 @@ bool totp_scene_app_settings_handle_event( } else if(scene_state->selected_control == MinutesInput) { totp_roll_value_uint8_t( &scene_state->tz_offset_minutes, -15, 0, 45, RollOverflowBehaviorRoll); - } else if(scene_state->selected_control == Sound) { + } else if(scene_state->selected_control == FontSelect) { + totp_roll_value_uint8_t( + &scene_state->active_font, + -1, + 0, + AVAILABLE_FONTS_COUNT - 1, + RollOverflowBehaviorRoll); + } else if(scene_state->selected_control == SoundSwitch) { scene_state->notification_sound = !scene_state->notification_sound; - } else if(scene_state->selected_control == Vibro) { + } else if(scene_state->selected_control == VibroSwitch) { scene_state->notification_vibro = !scene_state->notification_vibro; - } else if(scene_state->selected_control == BadUsb) { + } else if(scene_state->selected_control == BadUsbSwitch) { scene_state->badusb_enabled = !scene_state->badusb_enabled; } #ifdef TOTP_BADBT_TYPE_ENABLED - else if(scene_state->selected_control == BadBt) { + else if(scene_state->selected_control == BadBtSwitch) { scene_state->badbt_enabled = !scene_state->badbt_enabled; } #endif - else if(scene_state->selected_control == FontSelector) { - totp_roll_value_uint8_t( - &scene_state->selected_font, -1, 0, MAX_CUSTOM_FONTS, RollOverflowBehaviorStop); - } break; case InputKeyOk: break; @@ -302,7 +328,8 @@ bool totp_scene_app_settings_handle_event( plugin_state->automation_method |= scene_state->badbt_enabled ? AutomationMethodBadBt : AutomationMethodNone; #endif - plugin_state->selected_font = scene_state->selected_font; + + plugin_state->active_font_index = scene_state->active_font; if(!totp_config_file_update_user_settings(plugin_state)) { totp_dialogs_config_updating_error(plugin_state); diff --git a/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c b/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c index da99623fd..0a0c8373a 100644 --- a/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c +++ b/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c @@ -3,7 +3,9 @@ #include #include #include +#include #include "totp_scene_generate_token.h" +#include "../../canvas_extensions.h" #include "../../../types/token_info.h" #include "../../../types/common.h" #include "../../constants.h" @@ -16,7 +18,6 @@ #ifdef TOTP_BADBT_TYPE_ENABLED #include "../../../workers/bt_type_code/bt_type_code.h" #endif -#include "../../fonts/active_font.h" #define PROGRESS_BAR_MARGIN (3) #define PROGRESS_BAR_HEIGHT (4) @@ -26,18 +27,18 @@ typedef struct { uint8_t progress_bar_width; uint8_t code_total_length; uint8_t code_offset_x; - uint8_t code_offset_x_inc; uint8_t code_offset_y; } UiPrecalculatedDimensions; typedef struct { - char last_code[TOTP_TOKEN_DIGITS_MAX_COUNT + 1]; + char last_code[TokenDigitsCountMax + 1]; TotpUsbTypeCodeWorkerContext* usb_type_code_worker_context; NotificationMessage const** notification_sequence_new_token; NotificationMessage const** notification_sequence_automation; FuriMutex* last_code_update_sync; TotpGenerateCodeWorkerContext* generate_code_worker_context; UiPrecalculatedDimensions ui_precalculated_dimensions; + const FONT_INFO* active_font; } SceneState; static const NotificationSequence* @@ -141,60 +142,14 @@ static void draw_totp_code(Canvas* const canvas, const PluginState* const plugin const TokenInfoIteratorContext* iterator_context = totp_config_get_token_iterator_context(plugin_state); uint8_t code_length = totp_token_info_iterator_get_current_token(iterator_context)->digits; - uint8_t offset_x = scene_state->ui_precalculated_dimensions.code_offset_x; - const FONT_INFO* current_font; - switch(plugin_state->selected_font) { - case 0: - current_font = &modeNine_15ptFontInfo; - break; - case 1: - current_font = &redHatMono_16ptFontInfo; - break; - case 2: - current_font = &bedstead_17ptFontInfo; - break; - case 3: - current_font = &zector_18ptFontInfo; - break; - case 4: - current_font = &_712Serif_24ptFontInfo; - break; - case 5: - current_font = &graph35pix_12ptFontInfo; - break; - case 6: - current_font = &karmaFuture_14ptFontInfo; - break; - case 7: - current_font = &funclimbingDemo_18ptFontInfo; - break; - case 8: - current_font = &dPComic_18ptFontInfo; - break; - case 9: - current_font = &pixelFlag_18ptFontInfo; - break; - default: - current_font = &modeNine_15ptFontInfo; - break; - } - uint8_t char_width = current_font->charInfo[0].width; - uint8_t offset_x_inc = scene_state->ui_precalculated_dimensions.code_offset_x_inc; - for(uint8_t i = 0; i < code_length; i++) { - char ch = scene_state->last_code[i]; - if(ch >= current_font->startChar && ch <= current_font->endChar) { - uint8_t char_index = ch - current_font->startChar; - canvas_draw_xbm( - canvas, - offset_x, - scene_state->ui_precalculated_dimensions.code_offset_y, - char_width, - current_font->height, - ¤t_font->data[current_font->charInfo[char_index].offset]); - } - offset_x += offset_x_inc; - } + canvas_draw_str_ex( + canvas, + scene_state->ui_precalculated_dimensions.code_offset_x, + scene_state->ui_precalculated_dimensions.code_offset_y, + scene_state->last_code, + code_length, + scene_state->active_font); } static void on_new_token_code_generated(bool time_left, void* context) { @@ -207,53 +162,15 @@ static void on_new_token_code_generated(bool time_left, void* context) { SceneState* scene_state = plugin_state->current_scene_state; const TokenInfo* current_token = totp_token_info_iterator_get_current_token(iterator_context); + const FONT_INFO* const font = scene_state->active_font; - const FONT_INFO* current_font; - switch(plugin_state->selected_font) { - case 0: - current_font = &modeNine_15ptFontInfo; - break; - case 1: - current_font = &redHatMono_16ptFontInfo; - break; - case 2: - current_font = &bedstead_17ptFontInfo; - break; - case 3: - current_font = &zector_18ptFontInfo; - break; - case 4: - current_font = &_712Serif_24ptFontInfo; - break; - case 5: - current_font = &graph35pix_12ptFontInfo; - break; - case 6: - current_font = &karmaFuture_14ptFontInfo; - break; - case 7: - current_font = &funclimbingDemo_18ptFontInfo; - break; - case 8: - current_font = &dPComic_18ptFontInfo; - break; - case 9: - current_font = &pixelFlag_18ptFontInfo; - break; - default: - current_font = &modeNine_15ptFontInfo; - break; - } - - uint8_t char_width = current_font->charInfo[0].width; + uint8_t char_width = font->charInfo[0].width; scene_state->ui_precalculated_dimensions.code_total_length = - current_token->digits * (char_width + current_font->spacePixels); + current_token->digits * (char_width + font->spacePixels); scene_state->ui_precalculated_dimensions.code_offset_x = (SCREEN_WIDTH - scene_state->ui_precalculated_dimensions.code_total_length) >> 1; - scene_state->ui_precalculated_dimensions.code_offset_x_inc = - char_width + current_font->spacePixels; scene_state->ui_precalculated_dimensions.code_offset_y = - SCREEN_HEIGHT_CENTER - (current_font->height >> 1); + SCREEN_HEIGHT_CENTER - (font->height >> 1); if(time_left) { notification_message( @@ -283,11 +200,11 @@ void totp_scene_generate_token_activate(PluginState* plugin_state) { scene_state->last_code_update_sync = furi_mutex_alloc(FuriMutexTypeNormal); if(plugin_state->automation_method & AutomationMethodBadUsb) { scene_state->usb_type_code_worker_context = totp_usb_type_code_worker_start( - scene_state->last_code, - TOTP_TOKEN_DIGITS_MAX_COUNT + 1, - scene_state->last_code_update_sync); + scene_state->last_code, TokenDigitsCountMax + 1, scene_state->last_code_update_sync); } + scene_state->active_font = available_fonts[plugin_state->active_font_index]; + #ifdef TOTP_BADBT_TYPE_ENABLED if(plugin_state->automation_method & AutomationMethodBadBt) { @@ -297,7 +214,7 @@ void totp_scene_generate_token_activate(PluginState* plugin_state) { totp_bt_type_code_worker_start( plugin_state->bt_type_code_worker_context, scene_state->last_code, - TOTP_TOKEN_DIGITS_MAX_COUNT + 1, + TokenDigitsCountMax + 1, scene_state->last_code_update_sync); } #endif diff --git a/applications/external/totp/workers/bt_type_code/bt_type_code.c b/applications/external/totp/workers/bt_type_code/bt_type_code.c index 8024dba78..a27467ed6 100644 --- a/applications/external/totp/workers/bt_type_code/bt_type_code.c +++ b/applications/external/totp/workers/bt_type_code/bt_type_code.c @@ -1,7 +1,7 @@ #include "bt_type_code.h" +#include #include #include -#include #include #include #include @@ -13,7 +13,7 @@ #include "../type_code_common.h" #include "../../features_config.h" -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL #define TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN FURI_HAL_BT_ADV_NAME_LENGTH #define TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN GAP_MAC_ADDR_SIZE #endif @@ -29,7 +29,7 @@ struct TotpBtTypeCodeWorkerContext { Bt* bt; bool is_advertising; bool is_connected; -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL char previous_bt_name[TOTP_BT_WORKER_BT_ADV_NAME_MAX_LEN]; uint8_t previous_bt_mac[TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN]; #endif @@ -39,7 +39,7 @@ static inline bool totp_type_code_worker_stop_requested() { return furi_thread_flags_get() & TotpBtTypeCodeWorkerEventStop; } -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL static void totp_type_code_worker_bt_set_app_mac(uint8_t* mac) { uint8_t max_i; size_t uid_size = furi_hal_version_uid_size(); @@ -49,7 +49,7 @@ static void totp_type_code_worker_bt_set_app_mac(uint8_t* mac) { max_i = TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN; } - const uint8_t* uid = furi_hal_version_uid(); + const uint8_t* uid = (const uint8_t*)UID64_BASE; //-V566 memcpy(mac, uid, max_i); for(uint8_t i = max_i; i < TOTP_BT_WORKER_BT_MAC_ADDRESS_LEN; i++) { mac[i] = 0; @@ -161,7 +161,7 @@ TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() { furi_delay_ms(200); bt_keys_storage_set_storage_path(context->bt, HID_BT_KEYS_STORAGE_PATH); -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL memcpy( &context->previous_bt_name[0], furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard), @@ -184,7 +184,7 @@ TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() { furi_hal_bt_start_advertising(); -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL bt_enable_peer_key_update(context->bt); #endif @@ -211,7 +211,7 @@ void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context) { furi_delay_ms(200); bt_keys_storage_set_default_path(context->bt); -#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_UL_XFW +#if TOTP_TARGET_FIRMWARE == TOTP_FIRMWARE_XTREME_UL furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, context->previous_bt_name); furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, context->previous_bt_mac); #endif diff --git a/applications/external/totp/workers/generate_totp_code/generate_totp_code.c b/applications/external/totp/workers/generate_totp_code/generate_totp_code.c index 6dbe329fd..74482517f 100644 --- a/applications/external/totp/workers/generate_totp_code/generate_totp_code.c +++ b/applications/external/totp/workers/generate_totp_code/generate_totp_code.c @@ -21,7 +21,7 @@ struct TotpGenerateCodeWorkerContext { void* on_code_lifetime_changed_handler_context; }; -static const char* STEAM_ALGO_ALPHABET = "23456789BCDFGHJKMNPQRTVWXY"; +static const char STEAM_ALGO_ALPHABET[] = "23456789BCDFGHJKMNPQRTVWXY"; static void int_token_to_str(uint64_t i_token_code, char* str, TokenDigitsCount len, TokenHashAlgo algo) { @@ -30,7 +30,7 @@ static void if(i_token_code == OTP_ERROR) { memset(str, '-', len); } else { - if(algo == STEAM) { + if(algo == TokenHashAlgoSteam) { char* s = str; for(uint8_t i = 0; i < len; i++, s++) { *s = STEAM_ALGO_ALPHABET[i_token_code % 26]; @@ -48,12 +48,12 @@ static void static TOTP_ALGO get_totp_algo_impl(TokenHashAlgo algo) { switch(algo) { - case SHA1: - case STEAM: + case TokenHashAlgoSha1: + case TokenHashAlgoSteam: return TOTP_ALGO_SHA1; - case SHA256: + case TokenHashAlgoSha256: return TOTP_ALGO_SHA256; - case SHA512: + case TokenHashAlgoSha512: return TOTP_ALGO_SHA512; default: break;