Merge pull request #378 from LedgerHQ/apr/bugfix/eip712_struct_review_glitch
EIP-712 verbose mode fix
This commit is contained in:
@@ -955,6 +955,9 @@ void coin_main(chain_config_t *coin_config) {
|
|||||||
#endif
|
#endif
|
||||||
storage.contractDetails = 0x00;
|
storage.contractDetails = 0x00;
|
||||||
storage.displayNonce = 0x00;
|
storage.displayNonce = 0x00;
|
||||||
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
||||||
|
storage.verbose_eip712 = 0x00;
|
||||||
|
#endif
|
||||||
storage.initialized = 0x01;
|
storage.initialized = 0x01;
|
||||||
nvm_write((void *) &N_storage, (void *) &storage, sizeof(internalStorage_t));
|
nvm_write((void *) &N_storage, (void *) &storage, sizeof(internalStorage_t));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,19 +7,25 @@ enum { UI_712_POS_REVIEW, UI_712_POS_END };
|
|||||||
static uint8_t ui_pos;
|
static uint8_t ui_pos;
|
||||||
|
|
||||||
static void dummy_cb(void) {
|
static void dummy_cb(void) {
|
||||||
if (!ui_712_next_field()) {
|
switch (ui_712_next_field()) {
|
||||||
if (ui_pos == UI_712_POS_REVIEW) {
|
case EIP712_NO_MORE_FIELD:
|
||||||
ux_flow_next();
|
if (ui_pos == UI_712_POS_REVIEW) {
|
||||||
ui_pos = UI_712_POS_END;
|
ux_flow_next();
|
||||||
} else // UI_712_POS_END
|
ui_pos = UI_712_POS_END;
|
||||||
{
|
} else // UI_712_POS_END
|
||||||
ux_flow_prev();
|
{
|
||||||
ui_pos = UI_712_POS_REVIEW;
|
ux_flow_prev();
|
||||||
}
|
ui_pos = UI_712_POS_REVIEW;
|
||||||
} else {
|
}
|
||||||
// temporarily disable button clicks, they will be re-enabled as soon as new data
|
break;
|
||||||
// is received and the page is redrawn with ux_flow_init()
|
case EIP712_FIELD_INCOMING:
|
||||||
G_ux.stack[0].button_push_callback = NULL;
|
// temporarily disable button clicks, they will be re-enabled as soon as new data
|
||||||
|
// is received and the page is redrawn with ux_flow_init()
|
||||||
|
G_ux.stack[0].button_push_callback = NULL;
|
||||||
|
break;
|
||||||
|
case EIP712_FIELD_LATER:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,10 +115,12 @@ void ui_712_redraw_generic_step(void) {
|
|||||||
/**
|
/**
|
||||||
* Called to fetch the next field if they have not all been processed yet
|
* Called to fetch the next field if they have not all been processed yet
|
||||||
*
|
*
|
||||||
* @return whether there will be a next field
|
* Also handles the special "Review struct" screen of the verbose mode
|
||||||
|
*
|
||||||
|
* @return the next field state
|
||||||
*/
|
*/
|
||||||
bool ui_712_next_field(void) {
|
e_eip712_nfs ui_712_next_field(void) {
|
||||||
bool next = false;
|
e_eip712_nfs state = EIP712_NO_MORE_FIELD;
|
||||||
|
|
||||||
if (ui_ctx == NULL) {
|
if (ui_ctx == NULL) {
|
||||||
apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED;
|
apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED;
|
||||||
@@ -126,13 +128,13 @@ bool ui_712_next_field(void) {
|
|||||||
if (ui_ctx->structs_to_review > 0) {
|
if (ui_ctx->structs_to_review > 0) {
|
||||||
ui_712_review_struct(path_get_nth_field_to_last(ui_ctx->structs_to_review));
|
ui_712_review_struct(path_get_nth_field_to_last(ui_ctx->structs_to_review));
|
||||||
ui_ctx->structs_to_review -= 1;
|
ui_ctx->structs_to_review -= 1;
|
||||||
}
|
state = EIP712_FIELD_LATER;
|
||||||
if (!ui_ctx->end_reached) {
|
} else if (!ui_ctx->end_reached) {
|
||||||
handle_eip712_return_code(true);
|
handle_eip712_return_code(true);
|
||||||
next = true;
|
state = EIP712_FIELD_INCOMING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return next;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
#define UI_712_FIELD_NAME_PROVIDED (1 << 1)
|
#define UI_712_FIELD_NAME_PROVIDED (1 << 1)
|
||||||
|
|
||||||
typedef enum { EIP712_FILTERING_BASIC, EIP712_FILTERING_FULL } e_eip712_filtering_mode;
|
typedef enum { EIP712_FILTERING_BASIC, EIP712_FILTERING_FULL } e_eip712_filtering_mode;
|
||||||
|
typedef enum {
|
||||||
|
EIP712_FIELD_LATER,
|
||||||
|
EIP712_FIELD_INCOMING,
|
||||||
|
EIP712_NO_MORE_FIELD
|
||||||
|
} e_eip712_nfs; // next field state
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool shown;
|
bool shown;
|
||||||
@@ -22,7 +27,7 @@ typedef struct {
|
|||||||
|
|
||||||
bool ui_712_init(void);
|
bool ui_712_init(void);
|
||||||
void ui_712_deinit(void);
|
void ui_712_deinit(void);
|
||||||
bool ui_712_next_field(void);
|
e_eip712_nfs ui_712_next_field(void);
|
||||||
void ui_712_review_struct(const void *const struct_ptr);
|
void ui_712_review_struct(const void *const struct_ptr);
|
||||||
bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length);
|
bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length);
|
||||||
void ui_712_end_sign(void);
|
void ui_712_end_sign(void);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ sig_ctx = {}
|
|||||||
# Output = ('uint8', [2, None, 4]) | ('bool', [])
|
# Output = ('uint8', [2, None, 4]) | ('bool', [])
|
||||||
def get_array_levels(typename):
|
def get_array_levels(typename):
|
||||||
array_lvls = list()
|
array_lvls = list()
|
||||||
regex = re.compile("(.*)\[([0-9]*)\]$")
|
regex = re.compile(r"(.*)\[([0-9]*)\]$")
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
result = regex.search(typename)
|
result = regex.search(typename)
|
||||||
@@ -42,7 +42,7 @@ def get_array_levels(typename):
|
|||||||
# Input = "uint64" | "string"
|
# Input = "uint64" | "string"
|
||||||
# Output = ('uint', 64) | ('string', None)
|
# Output = ('uint', 64) | ('string', None)
|
||||||
def get_typesize(typename):
|
def get_typesize(typename):
|
||||||
regex = re.compile("^(\w+?)(\d*)$")
|
regex = re.compile(r"^(\w+?)(\d*)$")
|
||||||
result = regex.search(typename)
|
result = regex.search(typename)
|
||||||
typename = result.group(1)
|
typename = result.group(1)
|
||||||
typesize = result.group(2)
|
typesize = result.group(2)
|
||||||
|
|||||||
Reference in New Issue
Block a user