From a984c9dd06ff2c9f5e3dddbb19f72ccbe80a278d Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 14:37:54 +0300 Subject: [PATCH 001/182] add invalid and account alias flags --- services/registration/pp.csv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/registration/pp.csv b/services/registration/pp.csv index aa1eb05..e34de5d 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -29,4 +29,5 @@ flag,flag_location_set,35,this is set when the location of the profile is set flag,flag_offerings_set,36,this is set when the offerings of the profile is set flag,flag_back_set,37,this is set when it is a back navigation flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded - +flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits) +flag,flag_alias_set,40,this is set when an account alias has been assigned to a user From 1f0e7c016ec75dc806b9acc23e3d29a098751bb0 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 14:40:17 +0300 Subject: [PATCH 002/182] add check for account alias data type --- store/db/db.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/store/db/db.go b/store/db/db.go index 10f360a..73c9c5d 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -130,7 +130,8 @@ func StringToDataTyp(str string) (DataTyp, error) { return DATA_GENDER, nil case "DATA_OFFERINGS": return DATA_OFFERINGS, nil - + case "DATA_ACCOUNT_ALIAS": + return DATA_ACCOUNT_ALIAS, nil default: return 0, errors.New("invalid DataTyp string") } From c09ce320105880eab4b18530d6bee22bfa956e81 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 14:46:09 +0300 Subject: [PATCH 003/182] feat: reset invalid pin flag,update template text --- services/registration/invalid_pin | 2 +- services/registration/invalid_pin.vis | 9 +++++++-- services/registration/invalid_pin_swa | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/services/registration/invalid_pin b/services/registration/invalid_pin index dd984ea..607c151 100644 --- a/services/registration/invalid_pin +++ b/services/registration/invalid_pin @@ -1 +1 @@ -The PIN you entered is invalid.The PIN must be different from your current PIN.For help call +254757628885 \ No newline at end of file +The PIN you entered is invalid.The PIN must be a 4 digit number. \ No newline at end of file diff --git a/services/registration/invalid_pin.vis b/services/registration/invalid_pin.vis index 3790a08..34e4193 100644 --- a/services/registration/invalid_pin.vis +++ b/services/registration/invalid_pin.vis @@ -1,3 +1,8 @@ -MOUT back 0 +LOAD reset_invalid_pin 6 +RELOAD reset_invalid_pin +MOUT retry 1 +MOUT quit 9 HALT -INCMP _ 0 +INCMP _ 1 +INCMP quit 9 +INCMP . * diff --git a/services/registration/invalid_pin_swa b/services/registration/invalid_pin_swa index 7512242..bba32c7 100644 --- a/services/registration/invalid_pin_swa +++ b/services/registration/invalid_pin_swa @@ -1 +1 @@ -PIN mpya na udhibitisho wa PIN mpya hazilingani.Tafadhali jaribu tena.Kwa usaidizi piga simu +254757628885. +PIN uliyoweka si sahihi. PIN lazima iwe nambari 4. \ No newline at end of file From 939df35c8c4914a8a3db1b8d5ce66451e1d0991a Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 14:48:19 +0300 Subject: [PATCH 004/182] register new menu handlers --- handlers/local.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/handlers/local.go b/handlers/local.go index 7d66c7d..2103c2f 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,6 +124,11 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack) ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount) ls.DbRs.AddLocalFunc("clear_temporary_value", appHandlers.ClearTemporaryValue) + ls.DbRs.AddLocalFunc("reset_invalid_pin", appHandlers.ResetInvalidPIN) + ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias) + ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) + ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) + ls.first = appHandlers.Init return appHandlers, nil From d92dc026f5582eec4cab388943e4e531d0212b92 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 14:51:16 +0300 Subject: [PATCH 005/182] check for invalid PIN --- services/registration/old_pin.vis | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/old_pin.vis b/services/registration/old_pin.vis index aa6eabf..de66e2c 100644 --- a/services/registration/old_pin.vis +++ b/services/registration/old_pin.vis @@ -1,8 +1,8 @@ -RELOAD reset_allow_update +RELOAD reset_incorrect MOUT back 0 HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH _ flag_allow_update 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP new_pin * From 28e734e0ba8df5747f773be020ebfde766474832 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 15:02:28 +0300 Subject: [PATCH 006/182] feat: add my alias menu option --- services/registration/my_account.vis | 3 +++ services/registration/my_account_alias.vis | 8 ++++++++ services/registration/my_account_alias_menu | 1 + services/registration/my_account_alias_menu_swa | 1 + 4 files changed, 13 insertions(+) create mode 100644 services/registration/my_account_alias.vis create mode 100644 services/registration/my_account_alias_menu create mode 100644 services/registration/my_account_alias_menu_swa diff --git a/services/registration/my_account.vis b/services/registration/my_account.vis index e3956d2..c0b624e 100644 --- a/services/registration/my_account.vis +++ b/services/registration/my_account.vis @@ -1,3 +1,4 @@ +LOAD authorize_account 16 LOAD reset_allow_update 0 MOUT profile 1 MOUT change_language 2 @@ -5,6 +6,7 @@ MOUT check_balance 3 MOUT check_statement 4 MOUT pin_options 5 MOUT my_address 6 +MOUT my_account_alias 7 MOUT back 0 HALT INCMP main 0 @@ -14,4 +16,5 @@ INCMP balances 3 INCMP check_statement 4 INCMP pin_management 5 INCMP address 6 +INCMP my_account_alias 7 INCMP . * diff --git a/services/registration/my_account_alias.vis b/services/registration/my_account_alias.vis new file mode 100644 index 0000000..506f432 --- /dev/null +++ b/services/registration/my_account_alias.vis @@ -0,0 +1,8 @@ +LOAD get_current_profile_info 0 +MAP get_current_profile_info +MOUT back 0 +HALT +INCMP _ 0 +LOAD request_custom_alias 0 +RELOAD request_custom_alias +INCMP confirm_new_alias * diff --git a/services/registration/my_account_alias_menu b/services/registration/my_account_alias_menu new file mode 100644 index 0000000..3351fdf --- /dev/null +++ b/services/registration/my_account_alias_menu @@ -0,0 +1 @@ +My Alias \ No newline at end of file diff --git a/services/registration/my_account_alias_menu_swa b/services/registration/my_account_alias_menu_swa new file mode 100644 index 0000000..fdb3f58 --- /dev/null +++ b/services/registration/my_account_alias_menu_swa @@ -0,0 +1 @@ +Lakabu yangu \ No newline at end of file From 0816190469cfb84675c163cf1293366fc04eeaad Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 15:08:29 +0300 Subject: [PATCH 007/182] feat: add node to update your alias --- services/registration/update_alias | 1 + services/registration/update_alias.vis | 7 +++++++ services/registration/update_alias_swa | 1 + 3 files changed, 9 insertions(+) create mode 100644 services/registration/update_alias create mode 100644 services/registration/update_alias.vis create mode 100644 services/registration/update_alias_swa diff --git a/services/registration/update_alias b/services/registration/update_alias new file mode 100644 index 0000000..30f4a65 --- /dev/null +++ b/services/registration/update_alias @@ -0,0 +1 @@ +Your alias has been updated successfully \ No newline at end of file diff --git a/services/registration/update_alias.vis b/services/registration/update_alias.vis new file mode 100644 index 0000000..fcbfc17 --- /dev/null +++ b/services/registration/update_alias.vis @@ -0,0 +1,7 @@ +LOAD confirm_new_alias 0 +RELOAD confirm_new_alias +MOUT back 0 +MOUT quit 9 +HALT +INCMP ^ 0 +INCMP quit 9 diff --git a/services/registration/update_alias_swa b/services/registration/update_alias_swa new file mode 100644 index 0000000..bc60faf --- /dev/null +++ b/services/registration/update_alias_swa @@ -0,0 +1 @@ +Ombi lako la kubadilisha lakabu limefanikiwa. \ No newline at end of file From b887c67e5da16cc8052a23a3aa5888088003439f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 15:14:04 +0300 Subject: [PATCH 008/182] add node to confirm your alias --- services/registration/confirm_new_alias | 2 ++ services/registration/confirm_new_alias.vis | 12 ++++++++++++ services/registration/confirm_new_alias_swa | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 services/registration/confirm_new_alias create mode 100644 services/registration/confirm_new_alias.vis create mode 100644 services/registration/confirm_new_alias_swa diff --git a/services/registration/confirm_new_alias b/services/registration/confirm_new_alias new file mode 100644 index 0000000..6cc2cc3 --- /dev/null +++ b/services/registration/confirm_new_alias @@ -0,0 +1,2 @@ +Your full alias will be: {{.get_suggested_alias}} +Please enter your PIN to confirm: diff --git a/services/registration/confirm_new_alias.vis b/services/registration/confirm_new_alias.vis new file mode 100644 index 0000000..ad56fe0 --- /dev/null +++ b/services/registration/confirm_new_alias.vis @@ -0,0 +1,12 @@ +LOAD reset_invalid_pin 6 +RELOAD reset_invalid_pin +LOAD get_suggested_alias 0 +RELOAD get_suggested_alias +MAP get_suggested_alias +MOUT back 0 +HALT +INCMP _ 0 +RELOAD authorize_account +CATCH incorrect_pin flag_incorrect_pin 1 +CATCH invalid_pin flag_invalid_pin 1 +CATCH update_alias flag_allow_update 1 diff --git a/services/registration/confirm_new_alias_swa b/services/registration/confirm_new_alias_swa new file mode 100644 index 0000000..e622e9c --- /dev/null +++ b/services/registration/confirm_new_alias_swa @@ -0,0 +1,2 @@ +Lakabu yako kamili itakuwa: {{.get_suggested_alias}} +Tafadhali weka PIN yako ili kuthibitisha: From 78af4d225fe6b8c2bf078294f1083e1b36633138 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 15:47:17 +0300 Subject: [PATCH 009/182] add alias account template --- services/registration/my_account_alias | 2 ++ services/registration/my_account_alias_swa | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 services/registration/my_account_alias create mode 100644 services/registration/my_account_alias_swa diff --git a/services/registration/my_account_alias b/services/registration/my_account_alias new file mode 100644 index 0000000..678037b --- /dev/null +++ b/services/registration/my_account_alias @@ -0,0 +1,2 @@ +Current alias: {{.get_current_profile_info}} +Edit my alias: \ No newline at end of file diff --git a/services/registration/my_account_alias_swa b/services/registration/my_account_alias_swa new file mode 100644 index 0000000..9024a2e --- /dev/null +++ b/services/registration/my_account_alias_swa @@ -0,0 +1,2 @@ +Lakabu ya sasa +Badilisha Lakabu yangu: \ No newline at end of file From f922fb6d43ce994c63b9c97224f36d47a84d809c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 15:48:25 +0300 Subject: [PATCH 010/182] update authorize_account sink value --- services/registration/pin_management.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/pin_management.vis b/services/registration/pin_management.vis index 409b3c8..34d5e79 100644 --- a/services/registration/pin_management.vis +++ b/services/registration/pin_management.vis @@ -1,5 +1,5 @@ LOAD set_back 6 -LOAD authorize_account 5 +LOAD authorize_account 16 LOAD reset_allow_update 4 LOAD verify_new_pin 2 LOAD save_temporary_pin 1 From 8f7d5ff66d760fa531ae61b6b84cd10a6d16e790 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Feb 2025 16:34:00 +0300 Subject: [PATCH 011/182] feat: add request for ens based names from user input --- handlers/application/menuhandler.go | 126 ++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 7 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index b4cbd7b..176cff8 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1,6 +1,7 @@ package application import ( + "bytes" "context" "fmt" "path" @@ -453,6 +454,14 @@ func (h *MenuHandlers) CheckBlockedNumPinMisMatch(ctx context.Context, sym strin return res, nil } +// ResetInvalidPIN resets the invalid PIN flag +func (h *MenuHandlers) ResetInvalidPIN(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") + res.FlagReset = append(res.FlagReset, flag_invalid_pin) + return res, nil +} + // ConfirmPinChange validates user's new PIN. If input matches the temporary PIN, saves it as the new account PIN. func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result @@ -707,10 +716,6 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err) return res, err } - err := h.constructAccountAlias(ctx) - if err != nil { - return res, err - } res.FlagSet = append(res.FlagSet, flag_firstname_set) } else { if firstNameSet { @@ -1104,6 +1109,18 @@ func (h *MenuHandlers) GetCurrentProfileInfo(ctx context.Context, sym string, in } res.FlagSet = append(res.FlagSet, flag_offerings_set) res.Content = string(profileInfo) + case storedb.DATA_ACCOUNT_ALIAS: + profileInfo, err = store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) + if err != nil { + if db.IsNotFound(err) { + res.Content = defaultValue + break + } + logg.ErrorCtxf(ctx, "Failed to read account alias entry with", "key", "error", storedb.DATA_ACCOUNT_ALIAS, err) + return res, err + } + res.FlagSet = append(res.FlagSet, flag_offerings_set) + res.Content = string(profileInfo) default: break } @@ -1229,13 +1246,19 @@ func (h *MenuHandlers) UpdateAllProfileItems(ctx context.Context, sym string, in if !ok { return res, fmt.Errorf("missing session") } + flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") + aliasSet := h.st.MatchFlag(flag_alias_set, true) + err := h.insertProfileItems(ctx, sessionId, &res) if err != nil { return res, err } - err = h.constructAccountAlias(ctx) - if err != nil { - return res, err + //Only request an alias if it has not been set yet: + if !aliasSet { + err = h.constructAccountAlias(ctx) + if err != nil { + return res, err + } } return res, nil } @@ -1275,6 +1298,7 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) flag_incorrect_pin, _ := h.flagManager.GetFlag("flag_incorrect_pin") flag_account_authorized, _ := h.flagManager.GetFlag("flag_account_authorized") flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") store := h.userdataStore AccountPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN) @@ -1311,6 +1335,9 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) return res, nil } } else { + if string(input) != "0" { + res.FlagSet = append(res.FlagSet, flag_invalid_pin) + } return res, nil } return res, nil @@ -2393,6 +2420,91 @@ func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error { } return nil } +//RequestCustomAlias requests an ENS based alias name based on a user's input,then saves it as temporary value +func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + store := h.userdataStore + aliasHint, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + if db.IsNotFound(err) { + return res, nil + } + return res, err + } + //Ensures that the call doesn't happen twice for the same alias hint + if !bytes.Equal(aliasHint, input) { + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(string(input))) + if err != nil { + return res, err + } + pubKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + if db.IsNotFound(err) { + return res, nil + } + } + aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), string(input)) + if err != nil { + logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) + return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) + } + alias := aliasResult.Alias + + //Store the returned alias,wait for user to confirm it as new account alias + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(alias)) + if err != nil { + logg.ErrorCtxf(ctx, "failed to write account alias", "key", storedb.DATA_TEMPORARY_VALUE, "value", alias, "error", err) + return res, err + } + } + return res, nil +} + +//GetSuggestedAlias loads and displays the suggested alias name from the temporary value +func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + store := h.userdataStore + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + suggestedAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + return res, nil + } + res.Content = string(suggestedAlias) + return res, nil +} + +//ConfirmNewAlias reads the suggested alias from the temporary value and confirms it as the new account alias. +func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + store := h.userdataStore + + flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + newAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + return res, nil + } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(string(newAlias))) + if err != nil { + logg.ErrorCtxf(ctx, "failed to clear DATA_ACCOUNT_ALIAS_VALUE entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "value", "empty", "error", err) + return res, err + } + + res.FlagSet = append(res.FlagSet, flag_alias_set) + return res, nil +} // ClearTemporaryValue empties the DATA_TEMPORARY_VALUE at the main menu to prevent // previously stored data from being accessed From 5ed63cec39aa508e35dcbaf0fc729227c381c288 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 09:41:02 +0300 Subject: [PATCH 012/182] reset invalid PIN flag --- services/registration/pin_management.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/pin_management.vis b/services/registration/pin_management.vis index 34d5e79..ca54ee4 100644 --- a/services/registration/pin_management.vis +++ b/services/registration/pin_management.vis @@ -4,6 +4,7 @@ LOAD reset_allow_update 4 LOAD verify_new_pin 2 LOAD save_temporary_pin 1 LOAD reset_incorrect 0 +LOAD reset_invalid_pin 6 MOUT change_pin 1 MOUT reset_pin 2 MOUT back 0 From 7a6e5b094f8d3a30b7d4f469f9026138d9c7dd1f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 09:42:25 +0300 Subject: [PATCH 013/182] load current alias --- services/registration/my_account_alias_swa | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/my_account_alias_swa b/services/registration/my_account_alias_swa index 9024a2e..6d88e89 100644 --- a/services/registration/my_account_alias_swa +++ b/services/registration/my_account_alias_swa @@ -1,2 +1,2 @@ -Lakabu ya sasa +Lakabu ya sasa: {{.get_current_profile_info}} Badilisha Lakabu yangu: \ No newline at end of file From 3e422f269fab0341a5dcd062adf89a390ebc204e Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 13:14:27 +0300 Subject: [PATCH 014/182] feat: show alias if set on main node --- handlers/application/menuhandler.go | 40 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 176cff8..0d2a427 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1441,8 +1441,13 @@ func (h *MenuHandlers) ShowBlockedAccount(ctx context.Context, sym string, input // CheckBalance retrieves the balance of the active voucher and sets // the balance as the result content. func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error + + var ( + res resource.Result + err error + alias string + content string + ) sessionId, ok := ctx.Value("SessionId").(string) if !ok { @@ -1455,12 +1460,27 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt store := h.userdataStore + accAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) + if err != nil { + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read account alias entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "error", err) + return res, err + } + } else { + alias = strings.Split(string(accAlias), ".")[0] + } + // get the active sym and active balance activeSym, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { if db.IsNotFound(err) { balance := "0.00" - res.Content = l.Get("Balance: %s\n", balance) + if alias != "" { + content = l.Get("Alias: %s\nBalance: %s\n", alias, balance) + } else { + content = l.Get("Balance: %s\n", balance) + } + res.Content = content return res, nil } @@ -1484,7 +1504,12 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt // Format to 2 decimal places balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) - res.Content = l.Get("Balance: %s\n", balStr) + if alias != "" { + content = l.Get("Alias: %s\nBalance: %s\n", alias, balStr) + } else { + content = l.Get("Balance: %s\n", balStr) + } + res.Content = content return res, nil } @@ -2420,7 +2445,8 @@ func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error { } return nil } -//RequestCustomAlias requests an ENS based alias name based on a user's input,then saves it as temporary value + +// RequestCustomAlias requests an ENS based alias name based on a user's input,then saves it as temporary value func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result sessionId, ok := ctx.Value("SessionId").(string) @@ -2464,7 +2490,7 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input return res, nil } -//GetSuggestedAlias loads and displays the suggested alias name from the temporary value +// GetSuggestedAlias loads and displays the suggested alias name from the temporary value func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore @@ -2481,7 +2507,7 @@ func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input return res, nil } -//ConfirmNewAlias reads the suggested alias from the temporary value and confirms it as the new account alias. +// ConfirmNewAlias reads the suggested alias from the temporary value and confirms it as the new account alias. func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore From 226d1f5697f159fc7e13324a2d11fd9fb962fb99 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 13:21:42 +0300 Subject: [PATCH 015/182] fix: update authorize test function --- handlers/application/menuhandler_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index f008085..2a2263f 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1037,6 +1037,7 @@ func TestAuthorize(t *testing.T) { flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin") flag_account_authorized, _ := fm.GetFlag("flag_account_authorized") flag_allow_update, _ := fm.GetFlag("flag_allow_update") + flag_invalid_pin, _ := fm.GetFlag("flag_invalid_pin") // Set 1234 is the correct account pin accountPIN := "1234" @@ -1070,9 +1071,11 @@ func TestAuthorize(t *testing.T) { }, }, { - name: "Test with pin that is not a 4 digit", - input: []byte("1235aqds"), - expectedResult: resource.Result{}, + name: "Test with pin that is not a 4 digit", + input: []byte("1235aqds"), + expectedResult: resource.Result{ + FlagSet: []uint32{flag_invalid_pin}, + }, }, } From 0cbe391209760dc56cb16f7506ec9de6987c2521 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 16:00:54 +0300 Subject: [PATCH 016/182] update test data file to include my alias menu option --- menutraversal_test/group_test.json | 38 +++++++++---------- .../profile_edit_start_familyname.json | 2 +- .../profile_edit_start_firstname.json | 2 +- .../profile_edit_start_gender.json | 2 +- .../profile_edit_start_location.json | 2 +- .../profile_edit_start_offerings.json | 2 +- .../profile_edit_start_yob.json | 2 +- .../profile_edit_when_adjacent_item_set.json | 2 +- menutraversal_test/test_setup.json | 2 +- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index f4bc2df..d1041df 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -71,7 +71,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -108,11 +108,11 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "2", @@ -149,7 +149,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -173,7 +173,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -190,7 +190,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -239,7 +239,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -264,7 +264,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "3", @@ -292,7 +292,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -309,7 +309,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "3", @@ -337,7 +337,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -354,7 +354,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -411,7 +411,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -448,7 +448,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -489,7 +489,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -526,7 +526,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -563,7 +563,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -600,7 +600,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -633,7 +633,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_familyname.json b/menutraversal_test/profile_edit_start_familyname.json index 98325b0..bb8bf0d 100644 --- a/menutraversal_test/profile_edit_start_familyname.json +++ b/menutraversal_test/profile_edit_start_familyname.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_firstname.json b/menutraversal_test/profile_edit_start_firstname.json index 0f6be8b..1fa2ca6 100644 --- a/menutraversal_test/profile_edit_start_firstname.json +++ b/menutraversal_test/profile_edit_start_firstname.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_gender.json b/menutraversal_test/profile_edit_start_gender.json index afca12a..d95420f 100644 --- a/menutraversal_test/profile_edit_start_gender.json +++ b/menutraversal_test/profile_edit_start_gender.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_location.json b/menutraversal_test/profile_edit_start_location.json index 8852911..86541a3 100644 --- a/menutraversal_test/profile_edit_start_location.json +++ b/menutraversal_test/profile_edit_start_location.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_offerings.json b/menutraversal_test/profile_edit_start_offerings.json index 6aa40f6..2fc976a 100644 --- a/menutraversal_test/profile_edit_start_offerings.json +++ b/menutraversal_test/profile_edit_start_offerings.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_yob.json b/menutraversal_test/profile_edit_start_yob.json index 45227f7..10c1d11 100644 --- a/menutraversal_test/profile_edit_start_yob.json +++ b/menutraversal_test/profile_edit_start_yob.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_when_adjacent_item_set.json b/menutraversal_test/profile_edit_when_adjacent_item_set.json index f8d7263..ec7c880 100644 --- a/menutraversal_test/profile_edit_when_adjacent_item_set.json +++ b/menutraversal_test/profile_edit_when_adjacent_item_set.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/test_setup.json b/menutraversal_test/test_setup.json index 8728640..375be80 100644 --- a/menutraversal_test/test_setup.json +++ b/menutraversal_test/test_setup.json @@ -116,7 +116,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "6", From 830d867ac850b57e32200546b12f0a20b38fce89 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 16:35:17 +0300 Subject: [PATCH 017/182] chore: remove alias tag,use lower case b for balance --- handlers/application/menuhandler.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 0d2a427..497c501 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1476,9 +1476,9 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt if db.IsNotFound(err) { balance := "0.00" if alias != "" { - content = l.Get("Alias: %s\nBalance: %s\n", alias, balance) + content = l.Get("%s balance: %s\n", alias, balance) } else { - content = l.Get("Balance: %s\n", balance) + content = l.Get("balance: %s\n", balance) } res.Content = content return res, nil @@ -1505,9 +1505,9 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) if alias != "" { - content = l.Get("Alias: %s\nBalance: %s\n", alias, balStr) + content = l.Get("%s balance: %s\n", alias, balStr) } else { - content = l.Get("Balance: %s\n", balStr) + content = l.Get("balance: %s\n", balStr) } res.Content = content From 101afd5ebd2a581a0e1be43d54861bb645d8c56e Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 27 Feb 2025 16:35:41 +0300 Subject: [PATCH 018/182] update check balance test --- menutraversal_test/group_test.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index d1041df..b3177a9 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -284,7 +284,7 @@ }, { "input": "1234", - "expectedContent": "Balance: {balance}\n\n0:Back\n9:Quit" + "expectedContent": "{balance}\n\n0:Back\n9:Quit" }, { "input": "0", From 20c8af582c223e912de97017d80fe208f1c6dc94 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Feb 2025 17:29:18 +0300 Subject: [PATCH 019/182] switch to use ens api endpoint for the aliases requests --- services/remote.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/remote.go b/services/remote.go index baad08f..07e78fe 100644 --- a/services/remote.go +++ b/services/remote.go @@ -14,6 +14,6 @@ import ( func New(ctx context.Context, storageService storage.StorageService) remote.AccountService { return &httpremote.HTTPAccountService{ SS: storageService, - UseApi: false, + UseApi: true, } } From c2a0b05c84462067456970de472e5240dd6a0cd9 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 3 Mar 2025 12:12:46 +0300 Subject: [PATCH 020/182] fix: update expected content in checkbalance function --- handlers/application/menuhandler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 2a2263f..d8ef9b2 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1727,7 +1727,7 @@ func TestCheckBalance(t *testing.T) { publicKey: "0X98765432109", activeSym: "ETH", activeBal: "1.5", - expectedResult: resource.Result{Content: "Balance: 1.50 ETH\n"}, + expectedResult: resource.Result{Content: "balance: 1.50 ETH\n"}, expectError: false, }, } From e97d4be296ee2dd35197b28aabb7487fc3061886 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 3 Mar 2025 12:16:45 +0300 Subject: [PATCH 021/182] refactor: break down checkbalance function to avoild code redandancy,remove misplaced flag setting --- handlers/application/menuhandler.go | 68 ++++++++++++++++------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 497c501..f90012d 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -3,6 +3,7 @@ package application import ( "bytes" "context" + "errors" "fmt" "path" "strconv" @@ -1119,7 +1120,6 @@ func (h *MenuHandlers) GetCurrentProfileInfo(ctx context.Context, sym string, in logg.ErrorCtxf(ctx, "Failed to read account alias entry with", "key", "error", storedb.DATA_ACCOUNT_ALIAS, err) return res, err } - res.FlagSet = append(res.FlagSet, flag_offerings_set) res.Content = string(profileInfo) default: break @@ -1438,6 +1438,33 @@ func (h *MenuHandlers) ShowBlockedAccount(ctx context.Context, sym string, input return res, nil } +// loadUserContent loads the main user content in the main menu: the alias,balance associated with active voucher +func loadUserContent(ctx context.Context, activeSym string, balance string, alias string) (string, error) { + var content string + + code := codeFromCtx(ctx) + l := gotext.NewLocale(translationDir, code) + l.AddDomain("default") + + balFloat, err := strconv.ParseFloat(balance, 64) + if err != nil { + //Only exclude ErrSyntax error to avoid returning an error if the active bal is not available yet + if !errors.Is(err, strconv.ErrSyntax) { + logg.ErrorCtxf(ctx, "failed to parse activeBal as float", "value", balance, "error", err) + return "", err + } + balFloat = 0.00 + } + // Format to 2 decimal places + balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) + if alias != "" { + content = l.Get("%s balance: %s\n", alias, balStr) + } else { + content = l.Get("balance: %s\n", balStr) + } + return content, nil +} + // CheckBalance retrieves the balance of the active voucher and sets // the balance as the result content. func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) { @@ -1454,10 +1481,6 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt return res, fmt.Errorf("missing session") } - code := codeFromCtx(ctx) - l := gotext.NewLocale(translationDir, code) - l.AddDomain("default") - store := h.userdataStore accAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) @@ -1473,42 +1496,25 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt // get the active sym and active balance activeSym, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { - if db.IsNotFound(err) { - balance := "0.00" - if alias != "" { - content = l.Get("%s balance: %s\n", alias, balance) - } else { - content = l.Get("balance: %s\n", balance) - } - res.Content = content - return res, nil + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) + return res, err } - - logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) - return res, err } activeBal, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) if err != nil { - logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) - return res, err + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) + return res, err + } + } - // Convert activeBal from []byte to float64 - balFloat, err := strconv.ParseFloat(string(activeBal), 64) + content, err = loadUserContent(ctx, string(activeSym), string(activeBal), alias) if err != nil { - logg.ErrorCtxf(ctx, "failed to parse activeBal as float", "value", string(activeBal), "error", err) return res, err } - - // Format to 2 decimal places - balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) - - if alias != "" { - content = l.Get("%s balance: %s\n", alias, balStr) - } else { - content = l.Get("balance: %s\n", balStr) - } res.Content = content return res, nil From 4dba5f2ab5b36ee71b49e6885489dc9d2c5c948d Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 7 Mar 2025 09:48:30 +0300 Subject: [PATCH 022/182] dep: upgrade sarafu-api dep --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a75e399..23d306c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 1cd58c7..9b864a3 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 h1:cbBpm9uNJak58MpFpNXJuvgCmz+A8kquXr9har4expg= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae h1:C8k2d/QY6KPjz+3uzX5IJiRgwGjRniP14UBPcroAT94= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From bd0e7822ed9656b436710144b443351a6a25eb30 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 7 Mar 2025 16:13:23 +0300 Subject: [PATCH 023/182] dep: upgrade sarafu-api dep --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 23d306c..52af43b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 9b864a3..a40aff7 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae h1:C8k2d/QY6KPjz+3uzX5IJiRgwGjRniP14UBPcroAT94= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033 h1:nFesCueH+xTUKRtzRlrD/ha42MJBE1D7r/JjD/MwbHU= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From f7e7f7bd1cfa7e84014d942dd277909b0aff28b2 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Mar 2025 11:51:02 +0300 Subject: [PATCH 024/182] add for check back,add logs for the alias --- handlers/application/menuhandler.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index f90012d..1aeda8e 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1619,6 +1619,7 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input //Perform a search for each search domain,break on first match for _, domain := range config.SearchDomains() { fqdn := fmt.Sprintf("%s.%s", recipient, domain) + logg.InfoCtxf(ctx, "Resolving with fqdn alias", "alias", fqdn) AliasAddress, err = h.accountService.CheckAliasAddress(ctx, fqdn) if err == nil { AliasAddressResult = AliasAddress.Address @@ -2459,6 +2460,10 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input if !ok { return res, fmt.Errorf("missing session") } + if string(input) == "0" { + return res, nil + } + store := h.userdataStore aliasHint, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { From 38ef3b623e09fc6bf70adaec9f2a9ddd1f7e5da8 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Mar 2025 11:53:47 +0300 Subject: [PATCH 025/182] dep: update sarafu-api dep --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 52af43b..f9551c8 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index a40aff7..150df2c 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033 h1:nFesCueH+xTUKRtzRlrD/ha42MJBE1D7r/JjD/MwbHU= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46 h1:ikchtIvwd2MYWWvKZ8xFiozeON5JyIUnFZNq7pUgXlg= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 1af826e87fa4f2565748a4b05d1a1ed1dcbca59f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 10 Mar 2025 12:41:16 +0300 Subject: [PATCH 026/182] dep: update sarafu-api dep --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f9551c8..0063d15 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 150df2c..fc169cb 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46 h1:ikchtIvwd2MYWWvKZ8xFiozeON5JyIUnFZNq7pUgXlg= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From e5e857e3cb36ded2422c1a49ccb9b393557cbdd1 Mon Sep 17 00:00:00 2001 From: lash Date: Sat, 15 Mar 2025 03:02:25 +0000 Subject: [PATCH 027/182] Upgrade deps --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a75e399..4394631 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac + git.defalsify.org/vise.git v0.3.1 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 - git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 + git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 github.com/gofrs/uuid v4.4.0+incompatible diff --git a/go.sum b/go.sum index 1cd58c7..35b5a82 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ -git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac h1:f/E0ZTclVfMEnD/3Alrzzbg+dOm138zGydV42jT0JPw= -git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= +git.defalsify.org/vise.git v0.3.1 h1:A6FhMcur09ft/JzUPGXR+KpA17fltfeBnasyvLMZmq4= +git.defalsify.org/vise.git v0.3.1/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 h1:cbBpm9uNJak58MpFpNXJuvgCmz+A8kquXr9har4expg= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= From 374f79388c1086ac86ab8d7e19ce75a9a44b8a81 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Tue, 18 Mar 2025 17:48:55 +0300 Subject: [PATCH 028/182] ci/cd: remove ssh binary from Docker builds --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 191bc33..3998577 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,6 @@ WORKDIR /build/sarafu-vise RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM" RUN go mod download RUN go build -tags logtrace,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go -RUN go build -tags logtrace,online -o sarafu-ssh -ldflags="-X main.build=${BUILD} -s -w" cmd/ssh/main.go FROM debian:bookworm-slim @@ -37,7 +36,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /service COPY --from=build /build/sarafu-vise/sarafu-at . -COPY --from=build /build/sarafu-vise/sarafu-ssh . COPY --from=build /build/sarafu-vise/LICENSE . COPY --from=build /build/sarafu-vise/README.md . COPY --from=build /build/sarafu-vise/services ./services @@ -45,6 +43,5 @@ COPY --from=build /build/sarafu-vise/.env.example . RUN mv .env.example .env EXPOSE 7123 -EXPOSE 7122 CMD ["./sarafu-at"] From e564f1328bae24923e09a0e85e70c77f43297372 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 20 Mar 2025 13:48:34 +0300 Subject: [PATCH 029/182] add fetched vouchers log --- handlers/application/menuhandler.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 1aeda8e..dec7cd2 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2034,6 +2034,8 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by return res, nil } + logg.InfoCtxf(ctx, "fetched user vouchers", "public_key", string(publicKey), "vouchers", vouchersResp) + // check the current active sym and update the data activeSym, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if activeSym != nil { From 5f37856927dd4bbeefa346ea0bf1909fd8bcd0ef Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 20 Mar 2025 14:35:06 +0300 Subject: [PATCH 030/182] Added activeSym logs --- handlers/application/menuhandler.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index dec7cd2..a289076 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1941,9 +1941,11 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input flag_no_active_voucher, _ := h.flagManager.GetFlag("flag_no_active_voucher") // check if the user has an active sym - _, err = userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) + activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { + logg.InfoCtxf(ctx, "Checking the data as no", "DATA_ACTIVE_SYM", storedb.DATA_ACTIVE_SYM) + if db.IsNotFound(err) { publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { @@ -1958,6 +1960,8 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input return res, nil } + logg.InfoCtxf(ctx, "fetched user vouchers in SetDefaultVoucher", "public_key", string(publicKey), "vouchers", vouchersResp) + // Return if there is no voucher if len(vouchersResp) == 0 { res.FlagSet = append(res.FlagSet, flag_no_active_voucher) @@ -2007,6 +2011,8 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input return res, err } + logg.InfoCtxf(ctx, "The activeSym:", "activeSym", string(activeSym)) + res.FlagReset = append(res.FlagReset, flag_no_active_voucher) return res, nil From 3b16e25ebd2052e2331a69dc5edc4db607c7b1db Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 20 Mar 2025 14:54:06 +0300 Subject: [PATCH 031/182] Added debug logs --- handlers/application/menuhandler.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index a289076..639d59f 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1468,7 +1468,6 @@ func loadUserContent(ctx context.Context, activeSym string, balance string, alia // CheckBalance retrieves the balance of the active voucher and sets // the balance as the result content. func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var ( res resource.Result err error @@ -1496,19 +1495,21 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt // get the active sym and active balance activeSym, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { + logg.InfoCtxf(ctx, "could not find the activeSym in checkBalance:", "err", err) if !db.IsNotFound(err) { logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) return res, err } } + logg.InfoCtxf(ctx, "The active data in CheckBalance:", "activeSym", string(activeSym)) + activeBal, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) if err != nil { if !db.IsNotFound(err) { logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) return res, err } - } content, err = loadUserContent(ctx, string(activeSym), string(activeBal), alias) @@ -1944,7 +1945,7 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { - logg.InfoCtxf(ctx, "Checking the data as no", "DATA_ACTIVE_SYM", storedb.DATA_ACTIVE_SYM) + logg.InfoCtxf(ctx, "Checking the data as no activeSym", "DATA_ACTIVE_SYM", storedb.DATA_ACTIVE_SYM) if db.IsNotFound(err) { publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) @@ -2011,7 +2012,7 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input return res, err } - logg.InfoCtxf(ctx, "The activeSym:", "activeSym", string(activeSym)) + logg.InfoCtxf(ctx, "The activeSym in SetDefaultVoucher:", "activeSym", string(activeSym)) res.FlagReset = append(res.FlagReset, flag_no_active_voucher) @@ -2074,8 +2075,16 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by } } + + activeBal, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) + activeAddr, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) + + logg.InfoCtxf(ctx, "The active data in CheckVouchers:", "activeSym", string(activeSym), string(activeBal), string(activeAddr)) + data := store.ProcessVouchers(vouchersResp) + logg.InfoCtxf(ctx, "The data in CheckVouchers:", "data", data) + // Store all voucher data dataMap := map[storedb.DataTyp]string{ storedb.DATA_VOUCHER_SYMBOLS: data.Symbols, From d504571014809aec228a43fccb34da30b13e674d Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 20 Mar 2025 15:07:02 +0300 Subject: [PATCH 032/182] Added debug logs --- handlers/application/menuhandler.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 639d59f..8a8d6ed 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1979,10 +1979,14 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input // Scale down the balance scaledBalance := store.ScaleDownBalance(defaultBal, defaultDec) + logg.InfoCtxf(ctx, "firstVoucher data", "defaultSym", defaultSym, "defaultBal", defaultBal, "defaultDec", defaultDec, "defaultAddr", defaultAddr) + // TODO: implement atomic transaction // set the active symbol err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(defaultSym)) if err != nil { + logg.InfoCtxf(ctx, "got an error in writing DATA_ACTIVE_SYM", "defaultSym", defaultSym) + logg.ErrorCtxf(ctx, "failed to write defaultSym entry with", "key", storedb.DATA_ACTIVE_SYM, "value", defaultSym, "error", err) return res, err } @@ -2075,7 +2079,6 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by } } - activeBal, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) activeAddr, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) @@ -2083,7 +2086,7 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by data := store.ProcessVouchers(vouchersResp) - logg.InfoCtxf(ctx, "The data in CheckVouchers:", "data", data) + logg.InfoCtxf(ctx, "The data in CheckVouchers:", "data", data) // Store all voucher data dataMap := map[storedb.DataTyp]string{ From e681c9cfca0eb3353f44eb5a4fa4868b56c738e4 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 20 Mar 2025 15:23:36 +0300 Subject: [PATCH 033/182] Added debug logs --- handlers/application/menuhandler.go | 6 ++---- store/db/sub_prefix_db.go | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 8a8d6ed..d82cd51 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1931,7 +1931,6 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu // and sets the first as the default voucher, if no active voucher is set. func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result - var err error userStore := h.userdataStore sessionId, ok := ctx.Value("SessionId").(string) @@ -1943,8 +1942,9 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input // check if the user has an active sym activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) - + logg.InfoCtxf(ctx, "The activeSym in SetDefaultVoucher:", "activeSym", string(activeSym)) if err != nil { + logg.ErrorCtxf(ctx, "The err", err) logg.InfoCtxf(ctx, "Checking the data as no activeSym", "DATA_ACTIVE_SYM", storedb.DATA_ACTIVE_SYM) if db.IsNotFound(err) { @@ -2016,8 +2016,6 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input return res, err } - logg.InfoCtxf(ctx, "The activeSym in SetDefaultVoucher:", "activeSym", string(activeSym)) - res.FlagReset = append(res.FlagReset, flag_no_active_voucher) return res, nil diff --git a/store/db/sub_prefix_db.go b/store/db/sub_prefix_db.go index ae59171..156fbc2 100644 --- a/store/db/sub_prefix_db.go +++ b/store/db/sub_prefix_db.go @@ -33,11 +33,14 @@ func (s *SubPrefixDb) toKey(k []byte) []byte { func (s *SubPrefixDb) Get(ctx context.Context, key []byte) ([]byte, error) { s.store.SetPrefix(db.DATATYPE_USERDATA) key = s.toKey(key) + logg.InfoCtxf(ctx, "SubPrefixDb Get log", "key", string(key)) + return s.store.Get(ctx, key) } func (s *SubPrefixDb) Put(ctx context.Context, key []byte, val []byte) error { s.store.SetPrefix(db.DATATYPE_USERDATA) key = s.toKey(key) + logg.InfoCtxf(ctx, "SubPrefixDb Put log", "key", string(key)) return s.store.Put(ctx, key, val) } From 445ca0d0ffa09660468c113559ccb481c3fed274 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 20 Mar 2025 22:34:04 +0300 Subject: [PATCH 034/182] Add a default alias to remove bug in retrieving the data --- handlers/application/menuhandler.go | 39 ++++++++++------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index d82cd51..a8f7248 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -195,6 +195,7 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin data := map[storedb.DataTyp]string{ storedb.DATA_TRACKING_ID: trackingId, storedb.DATA_PUBLIC_KEY: publicKey, + storedb.DATA_ACCOUNT_ALIAS: "", } store := h.userdataStore for key, value := range data { @@ -1460,7 +1461,7 @@ func loadUserContent(ctx context.Context, activeSym string, balance string, alia if alias != "" { content = l.Get("%s balance: %s\n", alias, balStr) } else { - content = l.Get("balance: %s\n", balStr) + content = l.Get("Balance: %s\n", balStr) } return content, nil } @@ -1482,16 +1483,6 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt store := h.userdataStore - accAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) - if err != nil { - if !db.IsNotFound(err) { - logg.ErrorCtxf(ctx, "failed to read account alias entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "error", err) - return res, err - } - } else { - alias = strings.Split(string(accAlias), ".")[0] - } - // get the active sym and active balance activeSym, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { @@ -1502,8 +1493,6 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt } } - logg.InfoCtxf(ctx, "The active data in CheckBalance:", "activeSym", string(activeSym)) - activeBal, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) if err != nil { if !db.IsNotFound(err) { @@ -1512,6 +1501,16 @@ func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byt } } + accAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) + if err != nil { + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read account alias entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "error", err) + return res, err + } + } else { + alias = strings.Split(string(accAlias), ".")[0] + } + content, err = loadUserContent(ctx, string(activeSym), string(activeBal), alias) if err != nil { return res, err @@ -1941,12 +1940,8 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input flag_no_active_voucher, _ := h.flagManager.GetFlag("flag_no_active_voucher") // check if the user has an active sym - activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) - logg.InfoCtxf(ctx, "The activeSym in SetDefaultVoucher:", "activeSym", string(activeSym)) + _, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { - logg.ErrorCtxf(ctx, "The err", err) - logg.InfoCtxf(ctx, "Checking the data as no activeSym", "DATA_ACTIVE_SYM", storedb.DATA_ACTIVE_SYM) - if db.IsNotFound(err) { publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { @@ -1961,8 +1956,6 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input return res, nil } - logg.InfoCtxf(ctx, "fetched user vouchers in SetDefaultVoucher", "public_key", string(publicKey), "vouchers", vouchersResp) - // Return if there is no voucher if len(vouchersResp) == 0 { res.FlagSet = append(res.FlagSet, flag_no_active_voucher) @@ -1979,14 +1972,10 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input // Scale down the balance scaledBalance := store.ScaleDownBalance(defaultBal, defaultDec) - logg.InfoCtxf(ctx, "firstVoucher data", "defaultSym", defaultSym, "defaultBal", defaultBal, "defaultDec", defaultDec, "defaultAddr", defaultAddr) - // TODO: implement atomic transaction // set the active symbol err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(defaultSym)) if err != nil { - logg.InfoCtxf(ctx, "got an error in writing DATA_ACTIVE_SYM", "defaultSym", defaultSym) - logg.ErrorCtxf(ctx, "failed to write defaultSym entry with", "key", storedb.DATA_ACTIVE_SYM, "value", defaultSym, "error", err) return res, err } @@ -2084,8 +2073,6 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by data := store.ProcessVouchers(vouchersResp) - logg.InfoCtxf(ctx, "The data in CheckVouchers:", "data", data) - // Store all voucher data dataMap := map[storedb.DataTyp]string{ storedb.DATA_VOUCHER_SYMBOLS: data.Symbols, From b327b569fb9462b7ccade6f786ad1640d785484b Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 21 Mar 2025 09:05:51 +0300 Subject: [PATCH 035/182] fix failing test --- handlers/application/menuhandler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index d8ef9b2..2a2263f 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1727,7 +1727,7 @@ func TestCheckBalance(t *testing.T) { publicKey: "0X98765432109", activeSym: "ETH", activeBal: "1.5", - expectedResult: resource.Result{Content: "balance: 1.50 ETH\n"}, + expectedResult: resource.Result{Content: "Balance: 1.50 ETH\n"}, expectError: false, }, } From 680a1e968163c1eea905c2303a69a03852cfa799 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 21 Mar 2025 13:46:13 +0300 Subject: [PATCH 036/182] Use userstore for the voucher data instead of subprefixdb --- handlers/application/menuhandler.go | 33 +++++++++++++++++++++++------ store/vouchers.go | 6 +++--- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index a8f7248..4013edb 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -193,8 +193,8 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin publicKey := r.PublicKey data := map[storedb.DataTyp]string{ - storedb.DATA_TRACKING_ID: trackingId, - storedb.DATA_PUBLIC_KEY: publicKey, + storedb.DATA_TRACKING_ID: trackingId, + storedb.DATA_PUBLIC_KEY: publicKey, storedb.DATA_ACCOUNT_ALIAS: "", } store := h.userdataStore @@ -2081,25 +2081,44 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by storedb.DATA_VOUCHER_ADDRESSES: data.Addresses, } + // Write data entries for key, value := range dataMap { - if err := h.prefixDb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)); err != nil { - return res, nil + if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil { + logg.ErrorCtxf(ctx, "Failed to write data entry for sessionId: %s", sessionId, "key", key, "error", err) + continue } } + // for key, value := range dataMap { + // if err := h.prefixDb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)); err != nil { + // return res, nil + // } + // } + return res, nil } // GetVoucherList fetches the list of vouchers and formats them. func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + userStore := h.userdataStore // Read vouchers from the store - voucherData, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_VOUCHER_SYMBOLS)) + voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) if err != nil { - logg.ErrorCtxf(ctx, "Failed to read the voucherData from prefixDb", "error", err) + logg.ErrorCtxf(ctx, "failed to read voucherData entires with", "key", storedb.DATA_VOUCHER_SYMBOLS, "error", err) return res, err } + // voucherData, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_VOUCHER_SYMBOLS)) + // if err != nil { + // logg.ErrorCtxf(ctx, "Failed to read the voucherData from prefixDb", "error", err) + // return res, err + // } formattedData := h.ReplaceSeparatorFunc(string(voucherData)) @@ -2129,7 +2148,7 @@ func (h *MenuHandlers) ViewVoucher(ctx context.Context, sym string, input []byte return res, nil } - metadata, err := store.GetVoucherData(ctx, h.prefixDb, inputStr) + metadata, err := store.GetVoucherData(ctx, h.userdataStore, sessionId, inputStr) if err != nil { return res, fmt.Errorf("failed to retrieve voucher data: %v", err) } diff --git a/store/vouchers.go b/store/vouchers.go index 0569a60..94ebc5a 100644 --- a/store/vouchers.go +++ b/store/vouchers.go @@ -68,7 +68,7 @@ func ScaleDownBalance(balance, decimals string) string { } // GetVoucherData retrieves and matches voucher data -func GetVoucherData(ctx context.Context, db storedb.PrefixDb, input string) (*dataserviceapi.TokenHoldings, error) { +func GetVoucherData(ctx context.Context, store DataStore, sessionId string, input string) (*dataserviceapi.TokenHoldings, error) { keys := []storedb.DataTyp{ storedb.DATA_VOUCHER_SYMBOLS, storedb.DATA_VOUCHER_BALANCES, @@ -78,9 +78,9 @@ func GetVoucherData(ctx context.Context, db storedb.PrefixDb, input string) (*da data := make(map[storedb.DataTyp]string) for _, key := range keys { - value, err := db.Get(ctx, storedb.ToBytes(key)) + value, err := store.ReadEntry(ctx, sessionId, key) if err != nil { - return nil, fmt.Errorf("failed to get prefix key %x: %v", storedb.ToBytes(key), err) + return nil, fmt.Errorf("failed to get data key %x: %v", key, err) } data[key] = string(value) } From 30cb800450fc3f401c0e6b5b14594e6692830ea1 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 21 Mar 2025 13:58:30 +0300 Subject: [PATCH 037/182] Added log lines for voucherlist --- handlers/application/menuhandler.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 4013edb..e2d8751 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2083,6 +2083,7 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by // Write data entries for key, value := range dataMap { + logg.InfoCtxf(ctx, "Writing data entry for sessionId: %s", sessionId, "key", key, "value", value) if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil { logg.ErrorCtxf(ctx, "Failed to write data entry for sessionId: %s", sessionId, "key", key, "error", err) continue @@ -2110,6 +2111,7 @@ func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []b // Read vouchers from the store voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) + logg.InfoCtxf(ctx, "reading GetVoucherList entries for sessionId: %s", sessionId, "key", storedb.DATA_VOUCHER_SYMBOLS, "voucherData", voucherData) if err != nil { logg.ErrorCtxf(ctx, "failed to read voucherData entires with", "key", storedb.DATA_VOUCHER_SYMBOLS, "error", err) return res, err @@ -2122,6 +2124,8 @@ func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []b formattedData := h.ReplaceSeparatorFunc(string(voucherData)) + logg.InfoCtxf(ctx, "final output for sessionId: %s", sessionId, "key", storedb.DATA_VOUCHER_SYMBOLS, "formattedData", formattedData) + res.Content = string(formattedData) return res, nil From 1c8bda5ded08175b216bb157ae292ac66d408deb Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Sat, 22 Mar 2025 09:49:19 +0300 Subject: [PATCH 038/182] fix(alias): remove alias requests made when a profile item is edited,show a default value when an alias is not set --- handlers/application/menuhandler.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index e2d8751..9497b3d 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1121,7 +1121,12 @@ func (h *MenuHandlers) GetCurrentProfileInfo(ctx context.Context, sym string, in logg.ErrorCtxf(ctx, "Failed to read account alias entry with", "key", "error", storedb.DATA_ACCOUNT_ALIAS, err) return res, err } - res.Content = string(profileInfo) + alias := string(profileInfo) + if alias == "" { + res.Content = defaultValue + } else { + res.Content = alias + } default: break } @@ -1167,6 +1172,8 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b if alias != defaultValue { alias = strings.Split(alias, ".")[0] + } else if alias == "" { + alias = defaultValue } // Construct the full name @@ -1247,20 +1254,10 @@ func (h *MenuHandlers) UpdateAllProfileItems(ctx context.Context, sym string, in if !ok { return res, fmt.Errorf("missing session") } - flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") - aliasSet := h.st.MatchFlag(flag_alias_set, true) - err := h.insertProfileItems(ctx, sessionId, &res) if err != nil { return res, err } - //Only request an alias if it has not been set yet: - if !aliasSet { - err = h.constructAccountAlias(ctx) - if err != nil { - return res, err - } - } return res, nil } From b941cf256245f68a40888b33eb18c1d225e41f9b Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Sat, 22 Mar 2025 18:37:27 +0300 Subject: [PATCH 039/182] chore: match profile text prompt --- services/registration/my_account_alias | 2 +- services/registration/my_account_alias_swa | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/my_account_alias b/services/registration/my_account_alias index 678037b..726f06b 100644 --- a/services/registration/my_account_alias +++ b/services/registration/my_account_alias @@ -1,2 +1,2 @@ Current alias: {{.get_current_profile_info}} -Edit my alias: \ No newline at end of file +Enter your preferred alias:: \ No newline at end of file diff --git a/services/registration/my_account_alias_swa b/services/registration/my_account_alias_swa index 6d88e89..0ea3166 100644 --- a/services/registration/my_account_alias_swa +++ b/services/registration/my_account_alias_swa @@ -1,2 +1,2 @@ Lakabu ya sasa: {{.get_current_profile_info}} -Badilisha Lakabu yangu: \ No newline at end of file +Weka lakabu unalopendelea:: \ No newline at end of file From 87ebd0029b238500118e760912e53a0f0b3dbaac Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Sat, 22 Mar 2025 18:38:35 +0300 Subject: [PATCH 040/182] chore: show default value when profile info is not set --- handlers/application/menuhandler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 9497b3d..56dc661 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1170,9 +1170,9 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b offerings := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS)) alias := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS)) - if alias != defaultValue { + if alias != defaultValue && alias != "" { alias = strings.Split(alias, ".")[0] - } else if alias == "" { + } else { alias = defaultValue } From ddb8c6e748528fdcb88bfc2828b4d6814875e475 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Sat, 22 Mar 2025 18:39:05 +0300 Subject: [PATCH 041/182] add lowercase balance text translation --- services/registration/locale/swa/default.po | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/registration/locale/swa/default.po b/services/registration/locale/swa/default.po index 6155063..cac4737 100644 --- a/services/registration/locale/swa/default.po +++ b/services/registration/locale/swa/default.po @@ -30,3 +30,7 @@ msgstr "Salio la Kikundi: 0.00" msgid "Symbol: %s\nBalance: %s" msgstr "Sarafu: %s\nSalio: %s" + + +msgid "%s balance: %s\n" +msgstr "%s salio: %s\n" \ No newline at end of file From 74c82de4726cf8f6e2a8b330ebf5e3a84af1ffd1 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 24 Mar 2025 12:29:23 +0300 Subject: [PATCH 042/182] add check for if public key exists,then explicitly set flag_account_created --- handlers/application/menuhandler.go | 22 ++++++++++++++++++++++ services/registration/root.vis | 2 ++ 2 files changed, 24 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index e2d8751..d25cad0 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -242,6 +242,28 @@ func (h *MenuHandlers) CreateAccount(ctx context.Context, sym string, input []by return res, nil } +func (h *MenuHandlers) CheckAccountCreated(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + flag_account_created, _ := h.flagManager.GetFlag("flag_account_created") + + store := h.userdataStore + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + _, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + if !db.IsNotFound(err) { + return res, err + } + return res, nil + } + res.FlagSet = append(res.FlagSet, flag_account_created) + return res, nil +} + // ResetValidPin resets the flag_valid_pin flag. func (h *MenuHandlers) ResetValidPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result diff --git a/services/registration/root.vis b/services/registration/root.vis index 3c78bea..c57f31c 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -1,5 +1,7 @@ LOAD check_blocked_status 1 RELOAD check_blocked_status +LOAD check_account_created 2 +RELOAD check_account_created CATCH blocked_account flag_account_blocked 1 CATCH select_language flag_language_set 0 CATCH terms flag_account_created 0 From f6c9d54a653d605523c9d5daef632a01b466fc05 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 24 Mar 2025 12:39:03 +0300 Subject: [PATCH 043/182] register check-account_created handler --- handlers/local.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/local.go b/handlers/local.go index 2103c2f..43b0bb5 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -128,6 +128,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) + ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) ls.first = appHandlers.Init From 493f64157b174aca7b1bb5b55b68dcccc8255683 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 24 Mar 2025 15:59:13 +0300 Subject: [PATCH 044/182] sanitize alias hint before request --- handlers/application/menuhandler.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 56dc661..8473dcc 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -8,6 +8,7 @@ import ( "path" "strconv" "strings" + "unicode" "gopkg.in/leonelquinteros/gotext.v1" @@ -2509,7 +2510,8 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input return res, nil } } - aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), string(input)) + sanitizedInput := sanitizeAliasHint(string(input)) + aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), string(sanitizedInput)) if err != nil { logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) @@ -2526,6 +2528,17 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input return res, nil } +func sanitizeAliasHint(input string) string { + for i, r := range input { + // Check if the character is a special character (non-alphanumeric) + if !unicode.IsLetter(r) && !unicode.IsNumber(r) { + return input[:i] + } + } + // If no special character is found, return the whole input + return input +} + // GetSuggestedAlias loads and displays the suggested alias name from the temporary value func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result From c81b17994adce4e97f1a80dc697783b4be2fb065 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 24 Mar 2025 16:03:30 +0300 Subject: [PATCH 045/182] remove redundant cast on sanitized input --- handlers/application/menuhandler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 9dde6c3..d6d56a2 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2533,7 +2533,7 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input } } sanitizedInput := sanitizeAliasHint(string(input)) - aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), string(sanitizedInput)) + aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), sanitizedInput) if err != nil { logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) From 0828b1eb106607d65bab4487db713b3240082673 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 14:30:47 +0300 Subject: [PATCH 046/182] Increase the limit for the max_amount output --- services/registration/amount.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/amount.vis b/services/registration/amount.vis index 2266160..10d4430 100644 --- a/services/registration/amount.vis +++ b/services/registration/amount.vis @@ -1,5 +1,5 @@ LOAD reset_transaction_amount 0 -LOAD max_amount 10 +LOAD max_amount 40 RELOAD max_amount MAP max_amount MOUT back 0 From b2208359d6ee4b55775b22f9f7e1817e428ad0d8 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 19:46:42 +0300 Subject: [PATCH 047/182] Add missing param to the GetVoucherData --- handlers/event/token.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/handlers/event/token.go b/handlers/event/token.go index 713dab7..b9edb8b 100644 --- a/handlers/event/token.go +++ b/handlers/event/token.go @@ -49,9 +49,8 @@ func (eu *EventsUpdater) updateToken(ctx context.Context, identity identity.Iden // set default token to given symbol. func (eu *EventsUpdater) updateDefaultToken(ctx context.Context, identity identity.Identity, userStore *store.UserDataStore, activeSym string) error { - pfxDb := toPrefixDb(userStore, identity.SessionId) // TODO: the activeSym input should instead be newline separated list? - tokenData, err := store.GetVoucherData(ctx, pfxDb, activeSym) + tokenData, err := store.GetVoucherData(ctx, userStore, identity.SessionId, activeSym) if err != nil { return err } From 54b2088842cc6ff96ad228283da9ff75f5a84de4 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 19:53:02 +0300 Subject: [PATCH 048/182] Pass correct arguments in the TestGetVoucherData --- store/vouchers_test.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/store/vouchers_test.go b/store/vouchers_test.go index a98ffc3..711f93b 100644 --- a/store/vouchers_test.go +++ b/store/vouchers_test.go @@ -8,7 +8,6 @@ import ( "github.com/alecthomas/assert/v2" "github.com/stretchr/testify/require" - visedb "git.defalsify.org/vise.git/db" memdb "git.defalsify.org/vise.git/db/mem" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api" @@ -77,16 +76,8 @@ func TestProcessVouchers(t *testing.T) { } func TestGetVoucherData(t *testing.T) { - ctx := context.Background() - - db := memdb.NewMemDb() - err := db.Connect(ctx, "") - if err != nil { - t.Fatal(err) - } - - prefix := storedb.ToBytes(visedb.DATATYPE_USERDATA) - spdb := storedb.NewSubPrefixDb(db, prefix) + ctx, store := InitializeTestDb(t) + sessionId := "session123" // Test voucher data mockData := map[storedb.DataTyp][]byte{ @@ -98,13 +89,13 @@ func TestGetVoucherData(t *testing.T) { // Put the data for key, value := range mockData { - err = spdb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)) + err := store.WriteEntry(ctx, sessionId, key, []byte(value)) if err != nil { t.Fatal(err) } } - result, err := GetVoucherData(ctx, spdb, "1") + result, err := GetVoucherData(ctx, store, sessionId, "1") assert.NoError(t, err) assert.Equal(t, "SRF", result.TokenSymbol) From 419716a2b4e9bba6b0295bb4915b18cb300015f7 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 19:57:08 +0300 Subject: [PATCH 049/182] remove the subprefix db from TestCheckVouchers --- handlers/application/menuhandler_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 2a2263f..d4a42da 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2067,12 +2067,10 @@ func TestCheckVouchers(t *testing.T) { ctx, store := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) - spdb := InitializeTestSubPrefixDb(t, ctx) h := &MenuHandlers{ userdataStore: store, accountService: mockAccountService, - prefixDb: spdb, } err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) @@ -2104,7 +2102,7 @@ func TestCheckVouchers(t *testing.T) { assert.NoError(t, err) // Read voucher sym data from the store - voucherData, err := spdb.Get(ctx, storedb.ToBytes(storedb.DATA_VOUCHER_SYMBOLS)) + voucherData, err := store.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) if err != nil { t.Fatal(err) } From 71c01e00cd6a4468831d05dd0b61bd236882b4c2 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 19:58:43 +0300 Subject: [PATCH 050/182] remove commented out code --- handlers/application/menuhandler.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index d6d56a2..5cbea34 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2110,12 +2110,6 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by } } - // for key, value := range dataMap { - // if err := h.prefixDb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)); err != nil { - // return res, nil - // } - // } - return res, nil } @@ -2136,11 +2130,6 @@ func (h *MenuHandlers) GetVoucherList(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "failed to read voucherData entires with", "key", storedb.DATA_VOUCHER_SYMBOLS, "error", err) return res, err } - // voucherData, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_VOUCHER_SYMBOLS)) - // if err != nil { - // logg.ErrorCtxf(ctx, "Failed to read the voucherData from prefixDb", "error", err) - // return res, err - // } formattedData := h.ReplaceSeparatorFunc(string(voucherData)) From b8d53f82bbe501d35d10781f71b32e733551a58f Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 20:01:44 +0300 Subject: [PATCH 051/182] remove the subprefix db from TestGetVoucherList --- handlers/application/menuhandler_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index d4a42da..64df15d 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2124,20 +2124,19 @@ func TestCheckVouchers(t *testing.T) { func TestGetVoucherList(t *testing.T) { sessionId := "session123" - ctx := context.WithValue(context.Background(), "SessionId", sessionId) - - spdb := InitializeTestSubPrefixDb(t, ctx) + ctx, store := InitializeTestStore(t) + ctx = context.WithValue(ctx, "SessionId", sessionId) // Initialize MenuHandlers h := &MenuHandlers{ - prefixDb: spdb, + userdataStore: store, ReplaceSeparatorFunc: mockReplaceSeparator, } mockSyms := []byte("1:SRF\n2:MILO") // Put voucher sym data from the store - err := spdb.Put(ctx, storedb.ToBytes(storedb.DATA_VOUCHER_SYMBOLS), mockSyms) + err := store.WriteEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS, mockSyms) if err != nil { t.Fatal(err) } From 06c534cbb1c2b513a1ac6f1485c57f87ff3b1918 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 20:03:20 +0300 Subject: [PATCH 052/182] remove the subprefix db from TestViewVoucher --- handlers/application/menuhandler_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 64df15d..c83416d 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2156,15 +2156,11 @@ func TestViewVoucher(t *testing.T) { } ctx, store := InitializeTestStore(t) sessionId := "session123" - ctx = context.WithValue(ctx, "SessionId", sessionId) - spdb := InitializeTestSubPrefixDb(t, ctx) - h := &MenuHandlers{ userdataStore: store, flagManager: fm, - prefixDb: spdb, } // Define mock voucher data @@ -2177,7 +2173,7 @@ func TestViewVoucher(t *testing.T) { // Put the data for key, value := range mockData { - err = spdb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)) + err := store.WriteEntry(ctx, sessionId, key, []byte(value)) if err != nil { t.Fatal(err) } From 8ebd2bbbfaf2ceafeddff960f132ca8b34612d33 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 24 Mar 2025 20:06:07 +0300 Subject: [PATCH 053/182] remove alias updates from TestUpdateAllProfileItems --- handlers/application/menuhandler_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index c83416d..6c5f5a2 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -3469,15 +3469,6 @@ func TestUpdateAllProfileItems(t *testing.T) { err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) require.NoError(t, err) - aliasInput := fmt.Sprintf("%s%s", profileItems[0], profileItems[1]) - - // Mock the account alias response - mockAccountService.On( - "RequestAlias", - publicKey, - aliasInput, - ).Return(&models.RequestAliasResult{Alias: "JohnDoe"}, nil) - // Call the function under test res, err := h.UpdateAllProfileItems(ctx, "symbol", nil) assert.NoError(t, err) @@ -3489,10 +3480,6 @@ func TestUpdateAllProfileItems(t *testing.T) { assert.Equal(t, profileItems[i], string(storedValue)) } - // Validate alias storage - storedAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) - assert.NoError(t, err) - assert.Equal(t, "JohnDoe", string(storedAlias)) assert.Equal(t, expectedResult, res) } From 0791eb1f119cc383acef10b9e6eaff8abd915aa7 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Tue, 25 Mar 2025 09:52:37 +0300 Subject: [PATCH 054/182] ci/cd: build with log warn only --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3998577..60fa95a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN make VISE_PATH=/build/go-vise -B WORKDIR /build/sarafu-vise RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM" RUN go mod download -RUN go build -tags logtrace,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go +RUN go build -tags logwarn,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go FROM debian:bookworm-slim From 20ee4dfb24077c57bc7e9af9bf1e91f309c853c9 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 26 Mar 2025 14:26:31 +0300 Subject: [PATCH 055/182] replace SetDefaultVoucher and CheckVouchers with ManageVouchers --- handlers/application/menuhandler.go | 143 ++++++++++------------------ 1 file changed, 49 insertions(+), 94 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 5cbea34..7ac664c 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1946,9 +1946,11 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu return res, nil } -// SetDefaultVoucher retrieves the current vouchers -// and sets the first as the default voucher, if no active voucher is set. -func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input []byte) (resource.Result, error) { +// ManageVouchers retrieves the token holdings from the API using the "PublicKey" and +// 1. sets the first as the default voucher if no active voucher is set. +// 2. Stores list of vouchers +// 3. updates the balance of the active voucher +func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result userStore := h.userdataStore @@ -1959,30 +1961,33 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input flag_no_active_voucher, _ := h.flagManager.GetFlag("flag_no_active_voucher") - // check if the user has an active sym - _, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) + publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return res, err + } + + // Fetch vouchers from API + vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) + if err != nil { + res.FlagSet = append(res.FlagSet, flag_no_active_voucher) + return res, nil + } + + if len(vouchersResp) == 0 { + res.FlagSet = append(res.FlagSet, flag_no_active_voucher) + return res, nil + } + + res.FlagReset = append(res.FlagReset, flag_no_active_voucher) + + logg.InfoCtxf(ctx, "Fetched user vouchers", "public_key", string(publicKey), "vouchers", vouchersResp) + + // Check if user has an active voucher with proper error handling + activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { if db.IsNotFound(err) { - publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return res, err - } - - // Fetch vouchers from the API using the public key - vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) - if err != nil { - res.FlagSet = append(res.FlagSet, flag_no_active_voucher) - return res, nil - } - - // Return if there is no voucher - if len(vouchersResp) == 0 { - res.FlagSet = append(res.FlagSet, flag_no_active_voucher) - return res, nil - } - - // Use only the first voucher + // No active voucher, set the first one as default firstVoucher := vouchersResp[0] defaultSym := firstVoucher.TokenSymbol defaultBal := firstVoucher.Balance @@ -1992,71 +1997,27 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input // Scale down the balance scaledBalance := store.ScaleDownBalance(defaultBal, defaultDec) - // TODO: implement atomic transaction - // set the active symbol - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(defaultSym)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write defaultSym entry with", "key", storedb.DATA_ACTIVE_SYM, "value", defaultSym, "error", err) - return res, err - } - // set the active balance - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL, []byte(scaledBalance)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write defaultBal entry with", "key", storedb.DATA_ACTIVE_BAL, "value", scaledBalance, "error", err) - return res, err - } - // set the active decimals - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_DECIMAL, []byte(defaultDec)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write defaultDec entry with", "key", storedb.DATA_ACTIVE_DECIMAL, "value", defaultDec, "error", err) - return res, err - } - // set the active contract address - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte(defaultAddr)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write defaultAddr entry with", "key", storedb.DATA_ACTIVE_ADDRESS, "value", defaultAddr, "error", err) - return res, err + firstVoucherMap := map[storedb.DataTyp]string{ + storedb.DATA_ACTIVE_SYM: defaultSym, + storedb.DATA_ACTIVE_BAL: scaledBalance, + storedb.DATA_ACTIVE_DECIMAL: defaultDec, + storedb.DATA_ACTIVE_ADDRESS: defaultAddr, } - return res, nil + for key, value := range firstVoucherMap { + if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil { + logg.ErrorCtxf(ctx, "Failed to write active voucher data", "key", key, "error", err) + return res, err + } + } + + logg.InfoCtxf(ctx, "Default voucher set", "symbol", defaultSym, "balance", defaultBal, "decimals", defaultDec, "address", defaultAddr) + } else { + logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) + return res, err } - - logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) - return res, err - } - - res.FlagReset = append(res.FlagReset, flag_no_active_voucher) - - return res, nil -} - -// CheckVouchers retrieves the token holdings from the API using the "PublicKey" and stores -// them to gdbm. -func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - - userStore := h.userdataStore - publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return res, err - } - - // Fetch vouchers from the API using the public key - vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) - if err != nil { - return res, nil - } - - logg.InfoCtxf(ctx, "fetched user vouchers", "public_key", string(publicKey), "vouchers", vouchersResp) - - // check the current active sym and update the data - activeSym, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) - if activeSym != nil { + } else { + // Update active voucher balance activeSymStr := string(activeSym) // Find the matching voucher data @@ -2086,14 +2047,8 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by } } - activeBal, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) - activeAddr, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) - - logg.InfoCtxf(ctx, "The active data in CheckVouchers:", "activeSym", string(activeSym), string(activeBal), string(activeAddr)) - - data := store.ProcessVouchers(vouchersResp) - // Store all voucher data + data := store.ProcessVouchers(vouchersResp) dataMap := map[storedb.DataTyp]string{ storedb.DATA_VOUCHER_SYMBOLS: data.Symbols, storedb.DATA_VOUCHER_BALANCES: data.Balances, From 39e1c84a4571ff3b306bf8da18b1eb8e4d1923fc Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 26 Mar 2025 14:27:17 +0300 Subject: [PATCH 056/182] added TestManageVouchers for ManageVouchers --- handlers/application/menuhandler_test.go | 143 ++++++++++------------- 1 file changed, 63 insertions(+), 80 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 6c5f5a2..1a3789b 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1990,36 +1990,46 @@ func TestFetchCommunityBalance(t *testing.T) { } } -func TestSetDefaultVoucher(t *testing.T) { +func TestManageVouchers(t *testing.T) { sessionId := "session123" + publicKey := "0X13242618721" + ctx, store := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) fm, err := NewFlagManager(flagsPath) if err != nil { - t.Logf(err.Error()) + t.Fatal(err) } flag_no_active_voucher, err := fm.GetFlag("flag_no_active_voucher") if err != nil { - t.Logf(err.Error()) + t.Fatal(err) } - publicKey := "0X13242618721" + err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + if err != nil { + t.Fatal(err) + } tests := []struct { - name string - vouchersResp []dataserviceapi.TokenHoldings - expectedResult resource.Result + name string + vouchersResp []dataserviceapi.TokenHoldings + storedActiveVoucher string + expectedVoucherSymbols []byte + expectedUpdatedAddress []byte + expectedResult resource.Result }{ { - name: "Test no vouchers available", - vouchersResp: []dataserviceapi.TokenHoldings{}, + name: "No vouchers available", + vouchersResp: []dataserviceapi.TokenHoldings{}, + expectedVoucherSymbols: []byte(""), + expectedUpdatedAddress: []byte(""), expectedResult: resource.Result{ FlagSet: []uint32{flag_no_active_voucher}, }, }, { - name: "Test set default voucher when no active voucher is set", + name: "Set default voucher when no active voucher is set", vouchersResp: []dataserviceapi.TokenHoldings{ { ContractAddress: "0x123", @@ -2028,7 +2038,24 @@ func TestSetDefaultVoucher(t *testing.T) { Balance: "100", }, }, - expectedResult: resource.Result{}, + expectedVoucherSymbols: []byte("1:TOKEN1"), + expectedUpdatedAddress: []byte("0x123"), + expectedResult: resource.Result{ + FlagReset: []uint32{flag_no_active_voucher}, + }, + }, + { + name: "Check and update active voucher balance", + vouchersResp: []dataserviceapi.TokenHoldings{ + {ContractAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100"}, + {ContractAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"}, + }, + storedActiveVoucher: "SRF", + expectedVoucherSymbols: []byte("1:SRF\n2:MILO"), + expectedUpdatedAddress: []byte("0xd4c288865Ce"), + expectedResult: resource.Result{ + FlagReset: []uint32{flag_no_active_voucher}, + }, }, } @@ -2042,85 +2069,41 @@ func TestSetDefaultVoucher(t *testing.T) { flagManager: fm, } - err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) - if err != nil { - t.Fatal(err) - } - mockAccountService.On("FetchVouchers", string(publicKey)).Return(tt.vouchersResp, nil) - res, err := h.SetDefaultVoucher(ctx, "set_default_voucher", []byte("some-input")) + // Store active voucher if needed + if tt.storedActiveVoucher != "" { + err := store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) + if err != nil { + t.Fatal(err) + } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) + if err != nil { + t.Fatal(err) + } + } + res, err := h.ManageVouchers(ctx, "manage_vouchers", []byte("")) assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, res) - assert.Equal(t, res, tt.expectedResult, "Expected result should be equal to the actual result") + if tt.storedActiveVoucher != "" { + // Validate stored voucher symbols + voucherData, err := store.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) + assert.NoError(t, err) + assert.Equal(t, tt.expectedVoucherSymbols, voucherData) - mockAccountService.AssertExpectations(t) + // Validate stored active contract address + updatedAddress, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) + assert.NoError(t, err) + assert.Equal(t, tt.expectedUpdatedAddress, updatedAddress) + + mockAccountService.AssertExpectations(t) + } }) } } -func TestCheckVouchers(t *testing.T) { - mockAccountService := new(mocks.MockAccountService) - sessionId := "session123" - publicKey := "0X13242618721" - - ctx, store := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - h := &MenuHandlers{ - userdataStore: store, - accountService: mockAccountService, - } - - err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) - if err != nil { - t.Fatal(err) - } - - mockVouchersResponse := []dataserviceapi.TokenHoldings{ - {ContractAddress: "0xd4c288865Ce", TokenSymbol: "SRF", TokenDecimals: "6", Balance: "100"}, - {ContractAddress: "0x41c188d63Qa", TokenSymbol: "MILO", TokenDecimals: "4", Balance: "200"}, - } - - // store the default voucher data - err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte("SRF")) - if err != nil { - t.Fatal(err) - } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) - if err != nil { - t.Fatal(err) - } - - expectedSym := []byte("1:SRF\n2:MILO") - expectedUpdatedAddress := []byte("0xd4c288865Ce") - - mockAccountService.On("FetchVouchers", string(publicKey)).Return(mockVouchersResponse, nil) - - _, err = h.CheckVouchers(ctx, "check_vouchers", []byte("")) - assert.NoError(t, err) - - // Read voucher sym data from the store - voucherData, err := store.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) - if err != nil { - t.Fatal(err) - } - - // Read active contract address from the store - updatedAddress, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) - if err != nil { - t.Fatal(err) - } - - // assert that the data is stored correctly - assert.Equal(t, expectedSym, voucherData) - // assert that the address is updated - assert.Equal(t, expectedUpdatedAddress, updatedAddress) - - mockAccountService.AssertExpectations(t) -} - func TestGetVoucherList(t *testing.T) { sessionId := "session123" From ea117b722202f08f96be85a8bbb9291f5517edae Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 26 Mar 2025 14:28:43 +0300 Subject: [PATCH 057/182] replace SetDefaultVoucher and CheckVouchers with ManageVouchers --- handlers/local.go | 3 +-- services/registration/main.vis | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/handlers/local.go b/handlers/local.go index 43b0bb5..3116b66 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -103,8 +103,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange) ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp) ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance) - ls.DbRs.AddLocalFunc("set_default_voucher", appHandlers.SetDefaultVoucher) - ls.DbRs.AddLocalFunc("check_vouchers", appHandlers.CheckVouchers) + ls.DbRs.AddLocalFunc("manage_vouchers", appHandlers.ManageVouchers) ls.DbRs.AddLocalFunc("get_vouchers", appHandlers.GetVoucherList) ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher) ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher) diff --git a/services/registration/main.vis b/services/registration/main.vis index 5996c97..e934ec9 100644 --- a/services/registration/main.vis +++ b/services/registration/main.vis @@ -1,8 +1,6 @@ LOAD clear_temporary_value 2 RELOAD clear_temporary_value -LOAD set_default_voucher 8 -RELOAD set_default_voucher -LOAD check_vouchers 10 +LOAD manage_vouchers 0 RELOAD check_vouchers LOAD check_balance 128 RELOAD check_balance From 0914217769d327b782a29e6e58cefc4cb061ee7e Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 26 Mar 2025 14:33:23 +0300 Subject: [PATCH 058/182] increase the size limit for the manage_vouchers --- services/registration/main.vis | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/main.vis b/services/registration/main.vis index e934ec9..cda6844 100644 --- a/services/registration/main.vis +++ b/services/registration/main.vis @@ -1,7 +1,7 @@ LOAD clear_temporary_value 2 RELOAD clear_temporary_value -LOAD manage_vouchers 0 -RELOAD check_vouchers +LOAD manage_vouchers 160 +RELOAD manage_vouchers LOAD check_balance 128 RELOAD check_balance CATCH api_failure flag_api_call_error 1 From 04c7e204576ebf643c556e78270997a15af59236 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Mar 2025 14:38:47 +0300 Subject: [PATCH 059/182] set api call error flag to failing api calls --- handlers/application/menuhandler.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 5cbea34..229452d 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1403,7 +1403,7 @@ func (h *MenuHandlers) CheckAccountStatus(ctx context.Context, sym string, input if err != nil { res.FlagSet = append(res.FlagSet, flag_api_error) logg.ErrorCtxf(ctx, "failed on TrackAccountStatus", "error", err) - return res, err + return res, nil } res.FlagReset = append(res.FlagReset, flag_api_error) @@ -1569,6 +1569,7 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input } flag_invalid_recipient, _ := h.flagManager.GetFlag("flag_invalid_recipient") flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite") + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") recipient := string(input) @@ -1642,10 +1643,13 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input logg.InfoCtxf(ctx, "Resolving with fqdn alias", "alias", fqdn) AliasAddress, err = h.accountService.CheckAliasAddress(ctx, fqdn) if err == nil { + res.FlagReset = append(res.FlagReset, flag_api_error) AliasAddressResult = AliasAddress.Address continue } else { + res.FlagSet = append(res.FlagSet, flag_api_error) logg.ErrorCtxf(ctx, "failed to resolve alias", "alias", recipient, "error_alias_check", err) + return res, nil } } } @@ -2038,6 +2042,7 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by if !ok { return res, fmt.Errorf("missing session") } + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") userStore := h.userdataStore publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) @@ -2049,8 +2054,10 @@ func (h *MenuHandlers) CheckVouchers(ctx context.Context, sym string, input []by // Fetch vouchers from the API using the public key vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) if err != nil { + res.FlagSet = append(res.FlagSet, flag_api_error) return res, nil } + res.FlagReset = append(res.FlagReset, flag_api_error) logg.InfoCtxf(ctx, "fetched user vouchers", "public_key", string(publicKey), "vouchers", vouchersResp) From 3532f72fbde702a8185d8f937950b0b126d0568d Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Mar 2025 14:39:37 +0300 Subject: [PATCH 060/182] remove unneccessary catch --- services/registration/amount.vis | 1 - 1 file changed, 1 deletion(-) diff --git a/services/registration/amount.vis b/services/registration/amount.vis index 10d4430..ac3abd1 100644 --- a/services/registration/amount.vis +++ b/services/registration/amount.vis @@ -6,7 +6,6 @@ MOUT back 0 HALT LOAD validate_amount 64 RELOAD validate_amount -CATCH api_failure flag_api_call_error 1 CATCH invalid_amount flag_invalid_amount 1 INCMP _ 0 LOAD get_recipient 0 From 039117f40ed2bc7ff0270b91474181e523822066 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Mar 2025 14:40:32 +0300 Subject: [PATCH 061/182] add api call failure catch --- services/registration/main.vis | 1 + services/registration/send.vis | 1 + 2 files changed, 2 insertions(+) diff --git a/services/registration/main.vis b/services/registration/main.vis index 5996c97..1e2566d 100644 --- a/services/registration/main.vis +++ b/services/registration/main.vis @@ -4,6 +4,7 @@ LOAD set_default_voucher 8 RELOAD set_default_voucher LOAD check_vouchers 10 RELOAD check_vouchers +CATCH api_failure flag_api_call_error 1 LOAD check_balance 128 RELOAD check_balance CATCH api_failure flag_api_call_error 1 diff --git a/services/registration/send.vis b/services/registration/send.vis index 369bb67..dfdcd70 100644 --- a/services/registration/send.vis +++ b/services/registration/send.vis @@ -5,6 +5,7 @@ MOUT back 0 HALT LOAD validate_recipient 50 RELOAD validate_recipient +CATCH api_failure flag_api_call_error 1 CATCH invalid_recipient flag_invalid_recipient 1 CATCH invite_recipient flag_invalid_recipient_with_invite 1 INCMP _ 0 From e832f46d2215bca129eda300c57540628a14236e Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 26 Mar 2025 14:40:54 +0300 Subject: [PATCH 062/182] return to top on retry --- services/registration/api_failure.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/api_failure.vis b/services/registration/api_failure.vis index 37b3deb..c625bfe 100644 --- a/services/registration/api_failure.vis +++ b/services/registration/api_failure.vis @@ -1,5 +1,5 @@ MOUT retry 1 MOUT quit 9 HALT -INCMP _ 1 +INCMP ^ 1 INCMP quit 9 From 43d91f84f63de18da50847d6368a2b695b709586 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 10:49:31 +0300 Subject: [PATCH 063/182] use a different key for the suggested aliases --- handlers/application/menuhandler.go | 8 ++++---- store/db/db.go | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 5cbea34..1c0c044 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2530,7 +2530,7 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input alias := aliasResult.Alias //Store the returned alias,wait for user to confirm it as new account alias - err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(alias)) + err = store.WriteEntry(ctx, sessionId, storedb.DATA_SUGGESTED_ALIAS, []byte(alias)) if err != nil { logg.ErrorCtxf(ctx, "failed to write account alias", "key", storedb.DATA_TEMPORARY_VALUE, "value", alias, "error", err) return res, err @@ -2559,7 +2559,7 @@ func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input if !ok { return res, fmt.Errorf("missing session") } - suggestedAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + suggestedAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SUGGESTED_ALIAS) if err != nil { return res, nil } @@ -2567,7 +2567,7 @@ func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input return res, nil } -// ConfirmNewAlias reads the suggested alias from the temporary value and confirms it as the new account alias. +// ConfirmNewAlias reads the suggested alias from the [DATA_SUGGECTED_ALIAS] key and confirms it as the new account alias. func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore @@ -2578,7 +2578,7 @@ func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input [] if !ok { return res, fmt.Errorf("missing session") } - newAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + newAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SUGGESTED_ALIAS) if err != nil { return res, nil } diff --git a/store/db/db.go b/store/db/db.go index 73c9c5d..220ac56 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -63,6 +63,8 @@ const ( DATA_INITIAL_LANGUAGE_CODE //Fully qualified account alias string DATA_ACCOUNT_ALIAS + //currently suggested alias by the api awaiting user's confirmation as accepted account alias + DATA_SUGGESTED_ALIAS ) const ( From 18acb53eade2b93b4888f808b9cde7ca3b204df5 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 11:08:50 +0300 Subject: [PATCH 064/182] add alias logs --- handlers/application/menuhandler.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 1c0c044..efb61ca 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2509,6 +2509,7 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input } return res, err } + logg.InfoCtxf(ctx, "Read alias hint from temporary value", "hint", string(aliasHint)) //Ensures that the call doesn't happen twice for the same alias hint if !bytes.Equal(aliasHint, input) { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(string(input))) @@ -2522,12 +2523,14 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input } } sanitizedInput := sanitizeAliasHint(string(input)) + logg.InfoCtxf(ctx, "sanitized alias hint", "sanitizedhint", sanitizedInput) aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), sanitizedInput) if err != nil { logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) } alias := aliasResult.Alias + logg.InfoCtxf(ctx, "Suggested alias ", "alias", alias) //Store the returned alias,wait for user to confirm it as new account alias err = store.WriteEntry(ctx, sessionId, storedb.DATA_SUGGESTED_ALIAS, []byte(alias)) @@ -2582,6 +2585,7 @@ func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input [] if err != nil { return res, nil } + logg.InfoCtxf(ctx, "Confirming new alias", "alias", string(newAlias)) err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(string(newAlias))) if err != nil { logg.ErrorCtxf(ctx, "failed to clear DATA_ACCOUNT_ALIAS_VALUE entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "value", "empty", "error", err) From 39c0d3199541f0faad526777dbd8644b969cdc35 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 11:26:32 +0300 Subject: [PATCH 065/182] remove verbose logs --- handlers/application/menuhandler.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index efb61ca..13d1315 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -2509,7 +2509,6 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input } return res, err } - logg.InfoCtxf(ctx, "Read alias hint from temporary value", "hint", string(aliasHint)) //Ensures that the call doesn't happen twice for the same alias hint if !bytes.Equal(aliasHint, input) { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(string(input))) @@ -2523,7 +2522,6 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input } } sanitizedInput := sanitizeAliasHint(string(input)) - logg.InfoCtxf(ctx, "sanitized alias hint", "sanitizedhint", sanitizedInput) aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), sanitizedInput) if err != nil { logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) From 272a7ac05fdb0e73bbc3df901cb8114ff031cbcf Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 11:32:24 +0300 Subject: [PATCH 066/182] chore: remove extra colon --- services/registration/my_account_alias | 2 +- services/registration/my_account_alias_swa | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/my_account_alias b/services/registration/my_account_alias index 726f06b..4ab2e04 100644 --- a/services/registration/my_account_alias +++ b/services/registration/my_account_alias @@ -1,2 +1,2 @@ Current alias: {{.get_current_profile_info}} -Enter your preferred alias:: \ No newline at end of file +Enter your preferred alias: \ No newline at end of file diff --git a/services/registration/my_account_alias_swa b/services/registration/my_account_alias_swa index 0ea3166..3bd52a3 100644 --- a/services/registration/my_account_alias_swa +++ b/services/registration/my_account_alias_swa @@ -1,2 +1,2 @@ Lakabu ya sasa: {{.get_current_profile_info}} -Weka lakabu unalopendelea:: \ No newline at end of file +Weka lakabu unalopendelea: \ No newline at end of file From bbecec0310998fb21237995f31efd72a97e7874a Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 15:46:21 +0300 Subject: [PATCH 067/182] catch api call error when requesting an alias --- services/registration/my_account_alias.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/my_account_alias.vis b/services/registration/my_account_alias.vis index 506f432..1a6894f 100644 --- a/services/registration/my_account_alias.vis +++ b/services/registration/my_account_alias.vis @@ -5,4 +5,5 @@ HALT INCMP _ 0 LOAD request_custom_alias 0 RELOAD request_custom_alias +CATCH api_failure flag_api_call_error 1 INCMP confirm_new_alias * From c814c4ae5c275b59bcd1a128e8333c48549141cf Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 15:46:57 +0300 Subject: [PATCH 068/182] register handler to reset api call failure flag --- handlers/local.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/local.go b/handlers/local.go index 43b0bb5..459754b 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -129,6 +129,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) + ls.DbRs.AddLocalFunc("reset_api_call_failure", appHandlers.ResetApiCallFailure) ls.first = appHandlers.Init From 6c46c097fb0d93d3baaac8abe5d8f1c5ce4e1ba9 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 15:47:34 +0300 Subject: [PATCH 069/182] add explicit api call failure flag reset --- services/registration/api_failure.vis | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/registration/api_failure.vis b/services/registration/api_failure.vis index c625bfe..469b5db 100644 --- a/services/registration/api_failure.vis +++ b/services/registration/api_failure.vis @@ -1,3 +1,5 @@ +LOAD reset_api_call_failure 6 +RELOAD reset_api_call_failure MOUT retry 1 MOUT quit 9 HALT From 9674a04cbc7e1519e8f250515394c3ea2f7b4b69 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 15:51:56 +0300 Subject: [PATCH 070/182] add handler to reset api call failure flag,set flag when requesting an alias fails --- handlers/application/menuhandler.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 61125f8..cc86a9b 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -487,6 +487,14 @@ func (h *MenuHandlers) ResetInvalidPIN(ctx context.Context, sym string, input [] return res, nil } +// ResetApiCallFailure resets the api call failure flag +func (h *MenuHandlers) ResetApiCallFailure(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") + res.FlagReset = append(res.FlagReset, flag_api_error) + return res, nil +} + // ConfirmPinChange validates user's new PIN. If input matches the temporary PIN, saves it as the new account PIN. func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result @@ -2508,6 +2516,8 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input return res, nil } + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") + store := h.userdataStore aliasHint, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { @@ -2531,9 +2541,12 @@ func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input sanitizedInput := sanitizeAliasHint(string(input)) aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), sanitizedInput) if err != nil { + res.FlagSet = append(res.FlagSet, flag_api_error) logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) - return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) + return res, nil } + res.FlagReset = append(res.FlagReset, flag_api_error) + alias := aliasResult.Alias logg.InfoCtxf(ctx, "Suggested alias ", "alias", alias) From 95b9a6e48632941da862bf4a58964299231c7680 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 28 Mar 2025 16:09:53 +0300 Subject: [PATCH 071/182] catch api call failure when fetching voucher details --- services/registration/voucher_details.vis | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/registration/voucher_details.vis b/services/registration/voucher_details.vis index 1b009f1..628e034 100644 --- a/services/registration/voucher_details.vis +++ b/services/registration/voucher_details.vis @@ -1,5 +1,7 @@ CATCH no_voucher flag_no_active_voucher 1 LOAD get_voucher_details 0 +RELOAD get_voucher_details +CATCH api_failure flag_api_call_error 1 MAP get_voucher_details MOUT back 0 HALT From cd2f4328a8d91cd319c0fb533016b8e8c60a919f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 31 Mar 2025 15:41:19 +0300 Subject: [PATCH 072/182] check for api call failure when checking transactions --- services/registration/check_statement.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/check_statement.vis b/services/registration/check_statement.vis index d79b5ca..c393a0a 100644 --- a/services/registration/check_statement.vis +++ b/services/registration/check_statement.vis @@ -1,5 +1,6 @@ LOAD check_transactions 0 RELOAD check_transactions +CATCH api_failure flag_api_call_error 1 CATCH no_transfers flag_no_transfers 1 LOAD authorize_account 6 MOUT back 0 From f562ce8adf51318e59b8e99111670585950b4525 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 31 Mar 2025 15:41:49 +0300 Subject: [PATCH 073/182] check for api call failure when setting the dafault voucher --- services/registration/main.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/main.vis b/services/registration/main.vis index 1e2566d..30cadcd 100644 --- a/services/registration/main.vis +++ b/services/registration/main.vis @@ -2,6 +2,7 @@ LOAD clear_temporary_value 2 RELOAD clear_temporary_value LOAD set_default_voucher 8 RELOAD set_default_voucher +CATCH api_failure flag_api_call_error 1 LOAD check_vouchers 10 RELOAD check_vouchers CATCH api_failure flag_api_call_error 1 From 7883063e5365baf89d59a80baee2f6bb9993bbca Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 31 Mar 2025 15:42:27 +0300 Subject: [PATCH 074/182] feat: set and reset api call failure flags --- handlers/application/menuhandler.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index cc86a9b..42e4857 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1970,6 +1970,7 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input } flag_no_active_voucher, _ := h.flagManager.GetFlag("flag_no_active_voucher") + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") // check if the user has an active sym _, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) @@ -1984,9 +1985,10 @@ func (h *MenuHandlers) SetDefaultVoucher(ctx context.Context, sym string, input // Fetch vouchers from the API using the public key vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) if err != nil { - res.FlagSet = append(res.FlagSet, flag_no_active_voucher) + res.FlagSet = append(res.FlagSet, flag_api_error) return res, nil } + res.FlagReset = append(res.FlagReset, flag_api_error) // Return if there is no voucher if len(vouchersResp) == 0 { @@ -2246,6 +2248,7 @@ func (h *MenuHandlers) GetVoucherDetails(ctx context.Context, sym string, input res.FlagSet = append(res.FlagSet, flag_api_error) return res, nil } + res.FlagReset = append(res.FlagReset, flag_api_error) res.Content = fmt.Sprintf( "Name: %s\nSymbol: %s\nCommodity: %s\nLocation: %s", voucherData.TokenName, voucherData.TokenSymbol, voucherData.TokenCommodity, voucherData.TokenLocation, @@ -2279,6 +2282,7 @@ func (h *MenuHandlers) CheckTransactions(ctx context.Context, sym string, input logg.ErrorCtxf(ctx, "failed on FetchTransactions", "error", err) return res, err } + res.FlagReset = append(res.FlagReset, flag_api_error) // Return if there are no transactions if len(transactionsResp) == 0 { From ea0fc4491dd67f79448729eee0d4ad1079e89dd2 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 1 Apr 2025 11:12:38 +0300 Subject: [PATCH 075/182] removed debug related logs --- handlers/application/menuhandler.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 7ac664c..9199f14 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1981,8 +1981,6 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b res.FlagReset = append(res.FlagReset, flag_no_active_voucher) - logg.InfoCtxf(ctx, "Fetched user vouchers", "public_key", string(publicKey), "vouchers", vouchersResp) - // Check if user has an active voucher with proper error handling activeSym, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { @@ -2058,7 +2056,6 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b // Write data entries for key, value := range dataMap { - logg.InfoCtxf(ctx, "Writing data entry for sessionId: %s", sessionId, "key", key, "value", value) if err := userStore.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil { logg.ErrorCtxf(ctx, "Failed to write data entry for sessionId: %s", sessionId, "key", key, "error", err) continue From d0be79d817fed60f01027b8db101e5ba38134f9b Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 11:30:00 +0300 Subject: [PATCH 076/182] set account creation failed flag --- handlers/application/menuhandler.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 42e4857..b623a32 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -186,10 +186,16 @@ func (h *MenuHandlers) SetLanguage(ctx context.Context, sym string, input []byte // handles the account creation when no existing account is present for the session and stores associated data in the user data store. func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId string, res *resource.Result) error { flag_account_created, _ := h.flagManager.GetFlag("flag_account_created") + flag_account_creation_failed, _ := h.flagManager.GetFlag("flag_account_creation_failed") + r, err := h.accountService.CreateAccount(ctx) if err != nil { - return err + res.FlagSet = append(res.FlagSet, flag_account_creation_failed) + logg.ErrorCtxf(ctx, "failed to create an account", "error", err) + return nil } + res.FlagReset = append(res.FlagReset, flag_account_creation_failed) + trackingId := r.TrackingId publicKey := r.PublicKey From 3615348efdff2e45b8aefc770b86c34beb343a3a Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 11:57:59 +0300 Subject: [PATCH 077/182] add swahili template --- services/registration/api_failure_swa | 1 + 1 file changed, 1 insertion(+) create mode 100644 services/registration/api_failure_swa diff --git a/services/registration/api_failure_swa b/services/registration/api_failure_swa new file mode 100644 index 0000000..fb24f2c --- /dev/null +++ b/services/registration/api_failure_swa @@ -0,0 +1 @@ +Imeshindwa kuunganisha kwenye huduma ya uangalizi. Tafadhali jaribu tena. \ No newline at end of file From a7e8c184f5c5f18f947de96498807cf703929992 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 11:59:31 +0300 Subject: [PATCH 078/182] add some spacing --- services/registration/api_failure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/api_failure b/services/registration/api_failure index 06d2d9e..915b7fc 100644 --- a/services/registration/api_failure +++ b/services/registration/api_failure @@ -1 +1 @@ -Failed to connect to the custodial service.Please try again. \ No newline at end of file +Failed to connect to the custodial service .Please try again. \ No newline at end of file From 0458ac949819677304a763801ec60ad9536e3325 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 12:38:57 +0300 Subject: [PATCH 079/182] fix failing test --- handlers/application/menuhandler_test.go | 29 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 6c5f5a2..101ce8f 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -201,6 +201,8 @@ func TestCreateAccount(t *testing.T) { } flag_account_created, err := fm.GetFlag("flag_account_created") + flag_account_creation_failed, _ := fm.GetFlag("flag_account_creation_failed") + if err != nil { t.Logf(err.Error()) } @@ -217,7 +219,8 @@ func TestCreateAccount(t *testing.T) { PublicKey: "0xD3adB33f", }, expectedResult: resource.Result{ - FlagSet: []uint32{flag_account_created}, + FlagSet: []uint32{flag_account_created}, + FlagReset: []uint32{flag_account_creation_failed}, }, }, } @@ -2000,6 +2003,11 @@ func TestSetDefaultVoucher(t *testing.T) { t.Logf(err.Error()) } flag_no_active_voucher, err := fm.GetFlag("flag_no_active_voucher") + if err != nil { + t.Logf(err.Error()) + } + flag_api_error, err := fm.GetFlag("flag_api_call_error") + if err != nil { t.Logf(err.Error()) } @@ -2015,7 +2023,8 @@ func TestSetDefaultVoucher(t *testing.T) { name: "Test no vouchers available", vouchersResp: []dataserviceapi.TokenHoldings{}, expectedResult: resource.Result{ - FlagSet: []uint32{flag_no_active_voucher}, + FlagSet: []uint32{flag_no_active_voucher}, + FlagReset: []uint32{flag_api_error}, }, }, { @@ -2028,7 +2037,9 @@ func TestSetDefaultVoucher(t *testing.T) { Balance: "100", }, }, - expectedResult: resource.Result{}, + expectedResult: resource.Result{ + FlagReset: []uint32{flag_api_error}, + }, }, } @@ -2068,12 +2079,18 @@ func TestCheckVouchers(t *testing.T) { ctx, store := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + fm, err := NewFlagManager(flagsPath) + if err != nil { + t.Logf(err.Error()) + } + h := &MenuHandlers{ userdataStore: store, accountService: mockAccountService, + flagManager: fm, } - err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) if err != nil { t.Fatal(err) } @@ -2222,6 +2239,8 @@ func TestGetVoucherDetails(t *testing.T) { if err != nil { t.Logf(err.Error()) } + + flag_api_error, _ := fm.GetFlag("flag_api_call_error") mockAccountService := new(mocks.MockAccountService) sessionId := "session123" @@ -2249,8 +2268,8 @@ func TestGetVoucherDetails(t *testing.T) { "Name: %s\nSymbol: %s\nCommodity: %s\nLocation: %s", tokenDetails.TokenName, tokenDetails.TokenSymbol, tokenDetails.TokenCommodity, tokenDetails.TokenLocation, ) mockAccountService.On("VoucherData", string(tokA_AAddress)).Return(tokenDetails, nil) - res, err := h.GetVoucherDetails(ctx, "SessionId", []byte("")) + expectedResult.FlagReset = append(expectedResult.FlagReset, flag_api_error) assert.NoError(t, err) assert.Equal(t, expectedResult, res) } From 04880b58a8ac0f158c98509dded45b07cbd469cc Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 12:49:10 +0300 Subject: [PATCH 080/182] fix failing test --- menutraversal_test/group_test.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index b3177a9..99958dd 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -612,7 +612,7 @@ }, { "input": "1234", - "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit" + "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit" }, { "input": "0", From 8bf48cb0811fad1601208d2d802c3a8e7a3fcc91 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 16:25:59 +0300 Subject: [PATCH 081/182] update sarafu-api dep --- go.mod | 2 +- go.sum | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1b06b27..8a7e883 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.1 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 19c67fe..3bc00ee 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,12 @@ git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440 h1:eWrBZMM3pBMCFyRl4rO/aaR+OmOMFJxogNyFAFry+EM= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 695bfed349dbd92a5dc44016b8536f586c1b8468 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 16:30:08 +0300 Subject: [PATCH 082/182] feat: send invites when a recipient is not resolved --- handlers/application/menuhandler.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 13d1315..f634109 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1715,12 +1715,12 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp return res, fmt.Errorf("Data error encountered") } - // TODO - // send an invitation SMS - // if successful - // res.Content = l.Get("Your invitation to %s to join Sarafu Network has been sent.", string(recipient)) - - res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) + _, err := h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + if err != nil { + res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) + return res, nil + } + res.Content = l.Get("Your invitation to %s to join Sarafu Network has been sent.", string(recipient)) return res, nil } From 73c348640091dca1c83171aa5c570bc477ce8653 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 2 Apr 2025 10:47:33 +0300 Subject: [PATCH 083/182] catch api call failure when manage vouchers is called --- services/registration/main.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/main.vis b/services/registration/main.vis index cda6844..efa8b2a 100644 --- a/services/registration/main.vis +++ b/services/registration/main.vis @@ -2,6 +2,7 @@ LOAD clear_temporary_value 2 RELOAD clear_temporary_value LOAD manage_vouchers 160 RELOAD manage_vouchers +CATCH api_failure flag_api_call_error 1 LOAD check_balance 128 RELOAD check_balance CATCH api_failure flag_api_call_error 1 From cab90ed89a273999031f8a070b6f47e41ff9c785 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 2 Apr 2025 10:48:04 +0300 Subject: [PATCH 084/182] set and reset flag_api_error flag --- handlers/application/menuhandler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 722eb20..26cf13a 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1989,9 +1989,10 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b // Fetch vouchers from API vouchersResp, err := h.accountService.FetchVouchers(ctx, string(publicKey)) if err != nil { - res.FlagSet = append(res.FlagSet, flag_no_active_voucher) + res.FlagSet = append(res.FlagSet, flag_api_error) return res, nil } + res.FlagReset = append(res.FlagReset, flag_api_error) if len(vouchersResp) == 0 { res.FlagSet = append(res.FlagSet, flag_no_active_voucher) From 58242c8d55f4cd6a62681d19de4243d910871c88 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 2 Apr 2025 10:53:36 +0300 Subject: [PATCH 085/182] fix failing test: TestManageVouchers --- handlers/application/menuhandler_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index c3aa5ac..e3fd124 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2050,7 +2050,7 @@ func TestManageVouchers(t *testing.T) { expectedVoucherSymbols: []byte("1:TOKEN1"), expectedUpdatedAddress: []byte("0x123"), expectedResult: resource.Result{ - FlagReset: []uint32{flag_no_active_voucher}, + FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, }, }, { @@ -2063,7 +2063,7 @@ func TestManageVouchers(t *testing.T) { expectedVoucherSymbols: []byte("1:SRF\n2:MILO"), expectedUpdatedAddress: []byte("0xd4c288865Ce"), expectedResult: resource.Result{ - FlagReset: []uint32{flag_no_active_voucher}, + FlagReset: []uint32{flag_api_error, flag_no_active_voucher}, }, }, } From c5673b339b49c0d836dd0e2355d0bbd66ceee47a Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 2 Apr 2025 18:24:34 +0300 Subject: [PATCH 086/182] added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin --- store/db/db.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/store/db/db.go b/store/db/db.go index 220ac56..f7f7013 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -65,6 +65,8 @@ const ( DATA_ACCOUNT_ALIAS //currently suggested alias by the api awaiting user's confirmation as accepted account alias DATA_SUGGESTED_ALIAS + //currently suggested alias by the api awaiting user's confirmation as accepted account alias + DATA_SELF_PIN_RESET ) const ( From 2c671bc0d4f972894f4559393092abe5d2a9a286 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 2 Apr 2025 18:29:04 +0300 Subject: [PATCH 087/182] use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset --- handlers/application/menuhandler.go | 23 +++++++++++++++++++++-- services/registration/pp.csv | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 13d1315..1c28217 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -273,18 +273,29 @@ func (h *MenuHandlers) ResetValidPin(ctx context.Context, sym string, input []by return res, nil } -// CheckBlockedStatus resets the account blocked flag if the PIN attempts have been reset by an admin. +// CheckBlockedStatus: +// 1. Checks whether the DATA_SELF_PIN_RESET is 1 and sets the flag_account_pin_reset +// 2. resets the account blocked flag if the PIN attempts have been reset by an admin. func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore flag_account_blocked, _ := h.flagManager.GetFlag("flag_account_blocked") + flag_account_pin_reset, _ := h.flagManager.GetFlag("flag_account_pin_reset") sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") } + selfPinReset, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET) + if err == nil { + pinResetValue, _ := strconv.ParseUint(string(selfPinReset), 0, 64) + if pinResetValue == 1 { + res.FlagSet = append(res.FlagSet, flag_account_pin_reset) + } + } + currentWrongPinAttempts, err := store.ReadEntry(ctx, sessionId, storedb.DATA_INCORRECT_PIN_ATTEMPTS) if err != nil { if !db.IsNotFound(err) { @@ -293,7 +304,6 @@ func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input } pinAttemptsValue, _ := strconv.ParseUint(string(currentWrongPinAttempts), 0, 64) - if pinAttemptsValue == 0 { res.FlagReset = append(res.FlagReset, flag_account_blocked) return res, nil @@ -630,6 +640,7 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, // ValidateBlockedNumber performs validation of phone numbers, specifically for blocked numbers in the system. // It checks phone number format and verifies registration status. +// If valid, it sets DATA_SELF_PIN_RESET as 1 on the account func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result var err error @@ -665,10 +676,18 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in return res, err } } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) if err != nil { return res, nil } + + // set the DATA_SELF_PIN_RESET for the account + err = store.WriteEntry(ctx, formattedNumber, storedb.DATA_SELF_PIN_RESET, []byte("1")) + if err != nil { + return res, nil + } + return res, nil } diff --git a/services/registration/pp.csv b/services/registration/pp.csv index e34de5d..dec5b42 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -31,3 +31,4 @@ flag,flag_back_set,37,this is set when it is a back navigation flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits) flag,flag_alias_set,40,this is set when an account alias has been assigned to a user +flag,flag_account_pin_reset,41,this is set on an account when an admin triggers a PIN reset for them From ae0672c7da3324248c7856222501c14fbb2be051 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 2 Apr 2025 18:34:04 +0300 Subject: [PATCH 088/182] updated the vise version to pop the cache on a new session --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1b06b27..25c8c1e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.1 + git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 diff --git a/go.sum b/go.sum index 19c67fe..301a3ee 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ git.defalsify.org/vise.git v0.3.1 h1:A6FhMcur09ft/JzUPGXR+KpA17fltfeBnasyvLMZmq4= git.defalsify.org/vise.git v0.3.1/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= +git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 h1:FnT39aqXcP5YWhwPDBABopSjCu2SlbPFoOVitSpAVxU= +git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= From 4268cc05894a4ffefd54e0af0d1fa9c5b2b74298 Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Thu, 3 Apr 2025 15:45:41 +0300 Subject: [PATCH 089/182] build: logdebug mode --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 60fa95a..7c09597 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN make VISE_PATH=/build/go-vise -B WORKDIR /build/sarafu-vise RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM" RUN go mod download -RUN go build -tags logwarn,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go +RUN go build -tags logdebug,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go FROM debian:bookworm-slim From a11ca2a618ea4f7aa4a162ce949f4d7d2c7bd4ee Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 4 Apr 2025 12:05:04 +0300 Subject: [PATCH 090/182] reset the flag_language_set and flag_account_created flags if the publicKey does not exist on the db --- handlers/application/menuhandler.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 3077ef2..3378bb0 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -245,6 +245,7 @@ func (h *MenuHandlers) CreateAccount(ctx context.Context, sym string, input []by func (h *MenuHandlers) CheckAccountCreated(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + flag_language_set, _ := h.flagManager.GetFlag("flag_language_set") flag_account_created, _ := h.flagManager.GetFlag("flag_account_created") store := h.userdataStore @@ -256,11 +257,17 @@ func (h *MenuHandlers) CheckAccountCreated(ctx context.Context, sym string, inpu _, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { - if !db.IsNotFound(err) { - return res, err + if db.IsNotFound(err) { + // reset major flags + res.FlagReset = append(res.FlagReset, flag_language_set) + res.FlagReset = append(res.FlagReset, flag_account_created) + + return res, nil } + return res, nil } + res.FlagSet = append(res.FlagSet, flag_account_created) return res, nil } From fb2dc003b8778defe7a3c3b34cd2199a6693b3e6 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 7 Apr 2025 11:38:52 +0300 Subject: [PATCH 091/182] check recipient before sending an sms --- handlers/application/menuhandler.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index f634109..2f7d661 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1709,13 +1709,18 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp l := gotext.NewLocale(translationDir, code) l.AddDomain("default") - recipient, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) - if len(recipient) == 0 { - logg.ErrorCtxf(ctx, "recipient is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") + recipient, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + logg.ErrorCtxf(ctx, "Failed to read invalid recipient info", "error", err) + return res, err } - _, err := h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + if !phone.IsValidPhoneNumber(string(recipient)) { + logg.InfoCtxf(ctx, "corrupted recipient", "key", storedb.DATA_TEMPORARY_VALUE, "recipient", recipient) + return res, nil + } + + _, err = h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) if err != nil { res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) return res, nil From f96f9c11e6d32c3243dcae7c71dbc14fa98ec9bf Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:23:21 +0300 Subject: [PATCH 092/182] updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality --- handlers/application/menuhandler.go | 118 ++++++++++++---------------- 1 file changed, 52 insertions(+), 66 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 1c28217..d835d84 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -539,10 +539,57 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ return res, nil } +// ValidateBlockedNumber performs validation of phone numbers during the Reset other's PIN. +// It checks phone number format and verifies registration status. +// If valid, it writes the number under DATA_BLOCKED_NUMBER on the admin account +func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + var err error + + flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") + store := h.userdataStore + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + if string(input) == "0" { + res.FlagReset = append(res.FlagReset, flag_unregistered_number) + return res, nil + } + + blockedNumber := string(input) + formattedNumber, err := phone.FormatPhoneNumber(blockedNumber) + if err != nil { + res.FlagSet = append(res.FlagSet, flag_unregistered_number) + logg.ErrorCtxf(ctx, "Failed to format the phone number: %s", blockedNumber, "error", err) + return res, nil + } + + _, err = store.ReadEntry(ctx, formattedNumber, storedb.DATA_PUBLIC_KEY) + if err != nil { + if db.IsNotFound(err) { + logg.InfoCtxf(ctx, "Invalid or unregistered number") + res.FlagSet = append(res.FlagSet, flag_unregistered_number) + return res, nil + } else { + logg.ErrorCtxf(ctx, "Error on ValidateBlockedNumber", "error", err) + return res, err + } + } + + err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) + if err != nil { + return res, nil + } + + return res, nil +} + // ResetOthersPin handles the PIN reset process for other users' accounts by: // 1. Retrieving the blocked phone number from the session -// 2. Fetching the hashed temporary PIN associated with that number -// 3. Updating the account PIN with the temporary PIN +// 2. Writing the DATA_SELF_PIN_RESET on the blocked phone number +// 3. Resetting the DATA_INCORRECT_PIN_ATTEMPTS to 0 for the blocked phone number func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore @@ -555,19 +602,11 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "failed to read blockedPhonenumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) return res, err } - hashedTemporaryPin, err := store.ReadEntry(ctx, string(blockedPhonenumber), storedb.DATA_TEMPORARY_VALUE) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read hashedTmporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) - return res, err - } - if len(hashedTemporaryPin) == 0 { - logg.ErrorCtxf(ctx, "hashedTemporaryPin is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") - } - err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + // set the DATA_SELF_PIN_RESET for the account + err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_SELF_PIN_RESET, []byte("1")) if err != nil { - return res, err + return res, nil } err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_INCORRECT_PIN_ATTEMPTS, []byte(string("0"))) @@ -638,59 +677,6 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, return res, nil } -// ValidateBlockedNumber performs validation of phone numbers, specifically for blocked numbers in the system. -// It checks phone number format and verifies registration status. -// If valid, it sets DATA_SELF_PIN_RESET as 1 on the account -func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error - - flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") - store := h.userdataStore - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - - if string(input) == "0" { - res.FlagReset = append(res.FlagReset, flag_unregistered_number) - return res, nil - } - - blockedNumber := string(input) - formattedNumber, err := phone.FormatPhoneNumber(blockedNumber) - if err != nil { - res.FlagSet = append(res.FlagSet, flag_unregistered_number) - logg.ErrorCtxf(ctx, "Failed to format the phone number: %s", blockedNumber, "error", err) - return res, nil - } - - _, err = store.ReadEntry(ctx, formattedNumber, storedb.DATA_PUBLIC_KEY) - if err != nil { - if db.IsNotFound(err) { - logg.InfoCtxf(ctx, "Invalid or unregistered number") - res.FlagSet = append(res.FlagSet, flag_unregistered_number) - return res, nil - } else { - logg.ErrorCtxf(ctx, "Error on ValidateBlockedNumber", "error", err) - return res, err - } - } - - err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) - if err != nil { - return res, nil - } - - // set the DATA_SELF_PIN_RESET for the account - err = store.WriteEntry(ctx, formattedNumber, storedb.DATA_SELF_PIN_RESET, []byte("1")) - if err != nil { - return res, nil - } - - return res, nil -} - // VerifyCreatePin checks whether the confirmation PIN is similar to the temporary PIN // If similar, it sets the USERFLAG_PIN_SET flag and writes the account PIN allowing the user // to access the main menu. From d094af9c51d749884a731ffebeeffbddbbca05cb Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:25:11 +0300 Subject: [PATCH 093/182] move to the authorize_reset_others_pin if the given number is valid and registered --- services/registration/enter_other_number.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/enter_other_number.vis b/services/registration/enter_other_number.vis index 018aad3..56b0558 100644 --- a/services/registration/enter_other_number.vis +++ b/services/registration/enter_other_number.vis @@ -7,4 +7,4 @@ INCMP _ 0 LOAD validate_blocked_number 6 RELOAD validate_blocked_number CATCH unregistered_number flag_unregistered_number 1 -INCMP enter_others_new_pin * +INCMP authorize_reset_others_pin * From 8a6659a98b2f3b602ff35b7835ebd91c9eacbb65 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:25:50 +0300 Subject: [PATCH 094/182] request the admin to authorize the PIN reset --- services/registration/authorize_reset_others_pin | 2 ++ services/registration/authorize_reset_others_pin.vis | 12 ++++++++++++ services/registration/authorize_reset_others_pin_swa | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 services/registration/authorize_reset_others_pin create mode 100644 services/registration/authorize_reset_others_pin.vis create mode 100644 services/registration/authorize_reset_others_pin_swa diff --git a/services/registration/authorize_reset_others_pin b/services/registration/authorize_reset_others_pin new file mode 100644 index 0000000..1ed5a77 --- /dev/null +++ b/services/registration/authorize_reset_others_pin @@ -0,0 +1,2 @@ +{{.retrieve_blocked_number}} will get a PIN reset request. +Please enter your PIN to confirm: \ No newline at end of file diff --git a/services/registration/authorize_reset_others_pin.vis b/services/registration/authorize_reset_others_pin.vis new file mode 100644 index 0000000..6f9e5b3 --- /dev/null +++ b/services/registration/authorize_reset_others_pin.vis @@ -0,0 +1,12 @@ +LOAD retrieve_blocked_number 0 +RELOAD retrieve_blocked_number +MAP retrieve_blocked_number +MOUT back 0 +MOUT quit 9 +LOAD authorize_account 6 +HALT +RELOAD authorize_account +CATCH incorrect_pin flag_incorrect_pin 1 +INCMP _ 0 +INCMP quit 9 +INCMP pin_reset_result * diff --git a/services/registration/authorize_reset_others_pin_swa b/services/registration/authorize_reset_others_pin_swa new file mode 100644 index 0000000..4f355ac --- /dev/null +++ b/services/registration/authorize_reset_others_pin_swa @@ -0,0 +1,2 @@ +{{.retrieve_blocked_number}} atapokea ombi la kuweka upya PIN. +Tafadhali weka PIN yako kudhibitisha: \ No newline at end of file From 514f6ae05b6b89be45165cb250bcb2da1b0fba9b Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:26:21 +0300 Subject: [PATCH 095/182] move back to the previous node if the admin user is not authorized --- services/registration/pin_reset_result.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/pin_reset_result.vis b/services/registration/pin_reset_result.vis index de877e5..a676198 100644 --- a/services/registration/pin_reset_result.vis +++ b/services/registration/pin_reset_result.vis @@ -1,3 +1,4 @@ +CATCH _ flag_account_authorized 0 LOAD retrieve_blocked_number 0 MAP retrieve_blocked_number LOAD reset_others_pin 6 From 094866c1294de9fb2fcf80448f513283d9403af7 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 9 Apr 2025 14:49:41 +0300 Subject: [PATCH 096/182] add a logdb field to lhs and setter function --- handlers/local.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/handlers/local.go b/handlers/local.go index 3116b66..64bc38f 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -27,6 +27,7 @@ type LocalHandlerService struct { DbRs *resource.DbResource Pe *persist.Persister UserdataStore *db.Db + LogDb *db.Db Cfg engine.Config Rs resource.Resource first resource.EntryFunc @@ -57,12 +58,16 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) { ls.UserdataStore = db } +func (ls *LocalHandlerService) SetLogDb(db *db.Db) { + ls.LogDb = db +} + func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) (*application.MenuHandlers, error) { replaceSeparatorFunc := func(input string) string { return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator) } - appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, accountService, replaceSeparatorFunc) + appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, *ls.LogDb, accountService, replaceSeparatorFunc) if err != nil { return nil, err } From 3fff03a1644e59188efbeefbd274c9d97cbed68d Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 9 Apr 2025 14:50:28 +0300 Subject: [PATCH 097/182] update visedriver dep --- go.mod | 4 ++-- go.sum | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 25c8c1e..ccc1ca5 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 + git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b - git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 + git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 github.com/gofrs/uuid v4.4.0+incompatible diff --git a/go.sum b/go.sum index 301a3ee..ff01931 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,11 @@ -git.defalsify.org/vise.git v0.3.1 h1:A6FhMcur09ft/JzUPGXR+KpA17fltfeBnasyvLMZmq4= -git.defalsify.org/vise.git v0.3.1/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= -git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 h1:FnT39aqXcP5YWhwPDBABopSjCu2SlbPFoOVitSpAVxU= -git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= +git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsTAnebrB6QxRbB7zdoTHSmzzumXrJ4hw= +git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= From f4804546d98ba0132dc14206e7fded1c6a8c5568 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 9 Apr 2025 14:52:57 +0300 Subject: [PATCH 098/182] add log db struct with associated methods --- store/log_db.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 store/log_db.go diff --git a/store/log_db.go b/store/log_db.go new file mode 100644 index 0000000..d056a2e --- /dev/null +++ b/store/log_db.go @@ -0,0 +1,27 @@ +package store + +import ( + "context" + + visedb "git.defalsify.org/vise.git/db" + "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" + storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" +) + +type LogDb struct { + visedb.Db +} + +func (db *LogDb) WriteLogEntry(ctx context.Context, sessionId string, typ db.DataTyp, v []byte) error { + db.SetPrefix(visedb.DATATYPE_USERDATA) + db.SetSession(sessionId) + k := storedb.ToBytes(typ) + return db.Put(ctx, k, v) +} + +func (db *LogDb) ReadLogEntry(ctx context.Context, sessionId string, typ db.DataTyp) ([]byte, error) { + db.SetPrefix(visedb.DATATYPE_USERDATA) + db.SetSession(sessionId) + k := storedb.ToBytes(typ) + return db.Get(ctx, k) +} From 79bf09f3d1b7decd4fb46dbd9429d77b6765918f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Wed, 9 Apr 2025 14:55:35 +0300 Subject: [PATCH 099/182] add logdb to menuhandler and associated write operations --- handlers/application/menuhandler.go | 80 ++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 3378bb0..d6020a5 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -77,12 +77,13 @@ type MenuHandlers struct { flagManager *FlagManager accountService remote.AccountService prefixDb storedb.PrefixDb + logDb store.LogDb profile *profile.Profile ReplaceSeparatorFunc func(string) string } // NewHandlers creates a new instance of the Handlers struct with the provided dependencies. -func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService remote.AccountService, replaceSeparatorFunc func(string) string) (*MenuHandlers, error) { +func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, logdb db.Db, accountService remote.AccountService, replaceSeparatorFunc func(string) string) (*MenuHandlers, error) { if userdataStore == nil { return nil, fmt.Errorf("cannot create handler with nil userdata store") } @@ -90,6 +91,10 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService Db: userdataStore, } + logDb := store.LogDb{ + Db: logdb, + } + // Instantiate the SubPrefixDb with "DATATYPE_USERDATA" prefix prefix := storedb.ToBytes(db.DATATYPE_USERDATA) prefixDb := storedb.NewSubPrefixDb(userdataStore, prefix) @@ -99,6 +104,7 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService flagManager: appFlags, accountService: accountService, prefixDb: prefixDb, + logDb: logDb, profile: &profile.Profile{Max: 6}, ReplaceSeparatorFunc: replaceSeparatorFunc, } @@ -199,11 +205,16 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin storedb.DATA_ACCOUNT_ALIAS: "", } store := h.userdataStore + logdb := h.logDb for key, value := range data { err = store.WriteEntry(ctx, sessionId, key, []byte(value)) if err != nil { return err } + err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write log entry", "key", string(key), "value", value) + } } publicKeyNormalized, err := hex.NormalizeHex(publicKey) if err != nil { @@ -213,6 +224,12 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin if err != nil { return err } + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY_REVERSE, []byte(sessionId)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write log entry", "key", storedb.DATA_PUBLIC_KEY_REVERSE, "value", sessionId) + } + res.FlagSet = append(res.FlagSet, flag_account_created) return nil } @@ -509,6 +526,7 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ } store := h.userdataStore + logdb := h.logDb hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) @@ -532,6 +550,10 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "hashedPIN value", hashedTemporaryPin, "error", err) return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write hashed PIN db log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin) + } return res, nil } @@ -731,7 +753,10 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by return res, fmt.Errorf("missing session") } firstName := string(input) + store := h.userdataStore + logdb := h.logDb + flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") flag_firstname_set, _ := h.flagManager.GetFlag("flag_firstname_set") @@ -749,6 +774,11 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by return res, err } res.FlagSet = append(res.FlagSet, flag_firstname_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FIRST_NAME, []byte(temporaryFirstName)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write firtname db log entry", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName) + } } else { if firstNameSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName)) @@ -774,6 +804,7 @@ func (h *MenuHandlers) SaveFamilyname(ctx context.Context, sym string, input []b } store := h.userdataStore + logdb := h.logDb familyName := string(input) flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") @@ -793,6 +824,11 @@ func (h *MenuHandlers) SaveFamilyname(ctx context.Context, sym string, input []b return res, err } res.FlagSet = append(res.FlagSet, flag_familyname_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME, []byte(temporaryFamilyName)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write firtname db log entry", "key", storedb.DATA_FAMILY_NAME, "value", temporaryFamilyName) + } } else { if familyNameSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName)) @@ -849,6 +885,8 @@ func (h *MenuHandlers) SaveYob(ctx context.Context, sym string, input []byte) (r } yob := string(input) store := h.userdataStore + logdb := h.logDb + flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") flag_yob_set, _ := h.flagManager.GetFlag("flag_yob_set") @@ -867,6 +905,11 @@ func (h *MenuHandlers) SaveYob(ctx context.Context, sym string, input []byte) (r return res, err } res.FlagSet = append(res.FlagSet, flag_yob_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_YOB, []byte(temporaryYob)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write yob db log entry", "key", storedb.DATA_YOB, "value", temporaryYob) + } } else { if yobSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob)) @@ -892,6 +935,7 @@ func (h *MenuHandlers) SaveLocation(ctx context.Context, sym string, input []byt } location := string(input) store := h.userdataStore + logdb := h.logDb flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") flag_location_set, _ := h.flagManager.GetFlag("flag_location_set") @@ -910,6 +954,11 @@ func (h *MenuHandlers) SaveLocation(ctx context.Context, sym string, input []byt return res, err } res.FlagSet = append(res.FlagSet, flag_location_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_LOCATION, []byte(temporaryLocation)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write location db log entry", "key", storedb.DATA_LOCATION, "value", temporaryLocation) + } } else { if locationSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location)) @@ -937,6 +986,7 @@ func (h *MenuHandlers) SaveGender(ctx context.Context, sym string, input []byte) } gender := strings.Split(symbol, "_")[1] store := h.userdataStore + logdb := h.logDb flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") flag_gender_set, _ := h.flagManager.GetFlag("flag_gender_set") @@ -955,6 +1005,12 @@ func (h *MenuHandlers) SaveGender(ctx context.Context, sym string, input []byte) return res, err } res.FlagSet = append(res.FlagSet, flag_gender_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_GENDER, []byte(temporaryGender)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write gender db log entry", "key", storedb.DATA_TEMPORARY_VALUE, "value", temporaryGender) + } + } else { if genderSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(gender)) @@ -981,6 +1037,7 @@ func (h *MenuHandlers) SaveOfferings(ctx context.Context, sym string, input []by offerings := string(input) store := h.userdataStore + logdb := h.logDb flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") flag_offerings_set, _ := h.flagManager.GetFlag("flag_offerings_set") @@ -1000,6 +1057,11 @@ func (h *MenuHandlers) SaveOfferings(ctx context.Context, sym string, input []by return res, err } res.FlagSet = append(res.FlagSet, flag_offerings_set) + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FIRST_NAME, []byte(temporaryOfferings)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write offerings db log entry", "key", storedb.DATA_OFFERINGS, "value", offerings) + } } else { if offeringsSet { err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings)) @@ -1960,6 +2022,7 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result userStore := h.userdataStore + logdb := h.logDb sessionId, ok := ctx.Value("SessionId").(string) if !ok { @@ -2014,6 +2077,10 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "Failed to write active voucher data", "key", key, "error", err) return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write voucher db log entry", "key", key, "value", value) + } } logg.InfoCtxf(ctx, "Default voucher set", "symbol", defaultSym, "balance", defaultBal, "decimals", defaultDec, "address", defaultAddr) @@ -2210,6 +2277,7 @@ func (h *MenuHandlers) CheckTransactions(ctx context.Context, sym string, input flag_api_error, _ := h.flagManager.GetFlag("flag_api_error") userStore := h.userdataStore + logdb := h.logDb publicKey, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) @@ -2249,6 +2317,10 @@ func (h *MenuHandlers) CheckTransactions(ctx context.Context, sym string, input logg.ErrorCtxf(ctx, "failed to write to prefixDb", "error", err) return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write tx db log entry", "key", key, "value", value) + } } res.FlagReset = append(res.FlagReset, flag_no_transfers) @@ -2531,6 +2603,7 @@ func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore + logdb := h.logDb flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") @@ -2549,6 +2622,11 @@ func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input [] return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(newAlias)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write account alias db log entry", "key", storedb.DATA_ACCOUNT_ALIAS, "value", newAlias) + } + res.FlagSet = append(res.FlagSet, flag_alias_set) return res, nil } From 33c376c971e3d3757f972f457fbd52038bda20e0 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:10:12 +0300 Subject: [PATCH 100/182] set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset --- handlers/application/menuhandler.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index d835d84..1abb5ce 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -288,6 +288,8 @@ func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input return res, fmt.Errorf("missing session") } + res.FlagReset = append(res.FlagReset, flag_account_pin_reset) + selfPinReset, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET) if err == nil { pinResetValue, _ := strconv.ParseUint(string(selfPinReset), 0, 64) @@ -505,6 +507,7 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ return res, fmt.Errorf("missing session") } flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") + flag_account_pin_reset, _ := h.flagManager.GetFlag("flag_account_pin_reset") if string(input) == "0" { res.FlagReset = append(res.FlagReset, flag_pin_mismatch) @@ -535,6 +538,13 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "hashedPIN value", hashedTemporaryPin, "error", err) return res, err } + // set the DATA_SELF_PIN_RESET as 0 + err = store.WriteEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET, []byte("0")) + if err != nil { + logg.ErrorCtxf(ctx, "failed to write DATA_SELF_PIN_RESET entry with", "key", storedb.DATA_SELF_PIN_RESET, "self PIN reset value", "0", "error", err) + return res, err + } + res.FlagReset = append(res.FlagReset, flag_account_pin_reset) return res, nil } From 477f3a307a5fa4c5750c79b665137a11c25910b6 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:11:51 +0300 Subject: [PATCH 101/182] use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset --- services/registration/root.vis | 1 + services/registration/self_reset_pin | 2 ++ services/registration/self_reset_pin.vis | 8 ++++++++ services/registration/self_reset_pin_swa | 2 ++ 4 files changed, 13 insertions(+) create mode 100644 services/registration/self_reset_pin create mode 100644 services/registration/self_reset_pin.vis create mode 100644 services/registration/self_reset_pin_swa diff --git a/services/registration/root.vis b/services/registration/root.vis index c57f31c..923caef 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -2,6 +2,7 @@ LOAD check_blocked_status 1 RELOAD check_blocked_status LOAD check_account_created 2 RELOAD check_account_created +CATCH self_reset_pin flag_account_pin_reset 1 CATCH blocked_account flag_account_blocked 1 CATCH select_language flag_language_set 0 CATCH terms flag_account_created 0 diff --git a/services/registration/self_reset_pin b/services/registration/self_reset_pin new file mode 100644 index 0000000..ce40705 --- /dev/null +++ b/services/registration/self_reset_pin @@ -0,0 +1,2 @@ +A PIN reset has been done on your account. +Please enter a new four number PIN: \ No newline at end of file diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis new file mode 100644 index 0000000..3439fcd --- /dev/null +++ b/services/registration/self_reset_pin.vis @@ -0,0 +1,8 @@ +LOAD reset_invalid_pin 6 +HALT +LOAD save_temporary_pin 1 +RELOAD save_temporary_pin +LOAD verify_new_pin 2 +RELOAD verify_new_pin +CATCH invalid_pin flag_valid_pin 0 +INCMP confirm_self_pin_reset * diff --git a/services/registration/self_reset_pin_swa b/services/registration/self_reset_pin_swa new file mode 100644 index 0000000..0ef19d0 --- /dev/null +++ b/services/registration/self_reset_pin_swa @@ -0,0 +1,2 @@ +Uwekaji upya wa PIN umefanyika kwenye akaunti yako. +Tafadhali weka PIN mpya ya nambari nne: \ No newline at end of file From 71ef950fff654a4c1971f9706fe24f97060edc24 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:12:51 +0300 Subject: [PATCH 102/182] use the confirm_self_pin_reset to confirm the new PIN --- services/registration/confirm_self_pin_reset | 1 + services/registration/confirm_self_pin_reset.vis | 7 +++++++ services/registration/confirm_self_pin_reset_swa | 1 + 3 files changed, 9 insertions(+) create mode 100644 services/registration/confirm_self_pin_reset create mode 100644 services/registration/confirm_self_pin_reset.vis create mode 100644 services/registration/confirm_self_pin_reset_swa diff --git a/services/registration/confirm_self_pin_reset b/services/registration/confirm_self_pin_reset new file mode 100644 index 0000000..2e1b83e --- /dev/null +++ b/services/registration/confirm_self_pin_reset @@ -0,0 +1 @@ +Confirm your new PIN: \ No newline at end of file diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis new file mode 100644 index 0000000..043ad38 --- /dev/null +++ b/services/registration/confirm_self_pin_reset.vis @@ -0,0 +1,7 @@ +MOUT back 0 +HALT +INCMP _ 0 +LOAD confirm_pin_change 0 +RELOAD confirm_pin_change +CATCH pin_reset_mismatch flag_pin_mismatch 1 +INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset_swa b/services/registration/confirm_self_pin_reset_swa new file mode 100644 index 0000000..e407fec --- /dev/null +++ b/services/registration/confirm_self_pin_reset_swa @@ -0,0 +1 @@ +Thibitisha PIN yako mpya: \ No newline at end of file From aec96ce9ba11ca125dccb83fc07f3c274cebc825 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:19:23 +0300 Subject: [PATCH 103/182] move to the top node when one selects back --- services/registration/my_account.vis | 2 +- services/registration/pin_reset_success.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/my_account.vis b/services/registration/my_account.vis index c0b624e..fc0a634 100644 --- a/services/registration/my_account.vis +++ b/services/registration/my_account.vis @@ -9,7 +9,7 @@ MOUT my_address 6 MOUT my_account_alias 7 MOUT back 0 HALT -INCMP main 0 +INCMP ^ 0 INCMP edit_profile 1 INCMP change_language 2 INCMP balances 3 diff --git a/services/registration/pin_reset_success.vis b/services/registration/pin_reset_success.vis index a3a143f..5535616 100644 --- a/services/registration/pin_reset_success.vis +++ b/services/registration/pin_reset_success.vis @@ -1,6 +1,6 @@ MOUT back 0 MOUT quit 9 HALT -INCMP main 0 +INCMP ^ 0 INCMP quit 9 INCMP . * From f8c258a3b4b70d3c1822512faf8b9d55cef8ecfb Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:49:04 +0300 Subject: [PATCH 104/182] allow the user to quit and move to invalid_pin node if the given input is invalid --- services/registration/create_pin.vis | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/create_pin.vis b/services/registration/create_pin.vis index 40989ec..b329fc3 100644 --- a/services/registration/create_pin.vis +++ b/services/registration/create_pin.vis @@ -2,8 +2,8 @@ LOAD create_account 0 CATCH account_creation_failed flag_account_creation_failed 1 MOUT exit 0 HALT +INCMP quit 0 LOAD save_temporary_pin 6 RELOAD save_temporary_pin -CATCH . flag_incorrect_pin 1 -INCMP quit 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_create_pin * From 067c4962445823bed3dcea11691492620e3c72dc Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:55:46 +0300 Subject: [PATCH 105/182] use a single pin_mismatch node for a confirmed PIN that does not match the original PIN --- services/registration/confirm_create_pin.vis | 5 ++++- services/registration/confirm_pin_change.vis | 2 +- services/registration/confirm_self_pin_reset.vis | 2 +- services/registration/create_pin_mismatch.vis | 5 ----- services/registration/{create_pin_mismatch => pin_mismatch} | 0 .../{pin_reset_mismatch.vis => pin_mismatch.vis} | 0 .../{create_pin_mismatch_swa => pin_mismatch_swa} | 0 services/registration/pin_reset_mismatch | 1 - services/registration/pin_reset_mismatch_swa | 1 - 9 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 services/registration/create_pin_mismatch.vis rename services/registration/{create_pin_mismatch => pin_mismatch} (100%) rename services/registration/{pin_reset_mismatch.vis => pin_mismatch.vis} (100%) rename services/registration/{create_pin_mismatch_swa => pin_mismatch_swa} (100%) delete mode 100644 services/registration/pin_reset_mismatch delete mode 100644 services/registration/pin_reset_mismatch_swa diff --git a/services/registration/confirm_create_pin.vis b/services/registration/confirm_create_pin.vis index 02279dc..2e82d7d 100644 --- a/services/registration/confirm_create_pin.vis +++ b/services/registration/confirm_create_pin.vis @@ -1,4 +1,7 @@ -LOAD save_temporary_pin 6 +MOUT back 0 HALT +INCMP _ 0 LOAD verify_create_pin 8 +RELOAD verify_create_pin +CATCH pin_mismatch flag_pin_mismatch 1 INCMP account_creation * diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 09b12f8..6e50c11 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -3,5 +3,5 @@ MOUT back 0 HALT INCMP _ 0 RELOAD confirm_pin_change -CATCH pin_reset_mismatch flag_pin_mismatch 1 +CATCH pin_mismatch flag_pin_mismatch 1 INCMP * pin_reset_success diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis index 043ad38..419662b 100644 --- a/services/registration/confirm_self_pin_reset.vis +++ b/services/registration/confirm_self_pin_reset.vis @@ -3,5 +3,5 @@ HALT INCMP _ 0 LOAD confirm_pin_change 0 RELOAD confirm_pin_change -CATCH pin_reset_mismatch flag_pin_mismatch 1 +CATCH pin_mismatch flag_pin_mismatch 1 INCMP pin_reset_success * diff --git a/services/registration/create_pin_mismatch.vis b/services/registration/create_pin_mismatch.vis deleted file mode 100644 index 91793b5..0000000 --- a/services/registration/create_pin_mismatch.vis +++ /dev/null @@ -1,5 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP confirm_create_pin 1 -INCMP quit 9 diff --git a/services/registration/create_pin_mismatch b/services/registration/pin_mismatch similarity index 100% rename from services/registration/create_pin_mismatch rename to services/registration/pin_mismatch diff --git a/services/registration/pin_reset_mismatch.vis b/services/registration/pin_mismatch.vis similarity index 100% rename from services/registration/pin_reset_mismatch.vis rename to services/registration/pin_mismatch.vis diff --git a/services/registration/create_pin_mismatch_swa b/services/registration/pin_mismatch_swa similarity index 100% rename from services/registration/create_pin_mismatch_swa rename to services/registration/pin_mismatch_swa diff --git a/services/registration/pin_reset_mismatch b/services/registration/pin_reset_mismatch deleted file mode 100644 index dc0236b..0000000 --- a/services/registration/pin_reset_mismatch +++ /dev/null @@ -1 +0,0 @@ -The PIN is not a match. Try again diff --git a/services/registration/pin_reset_mismatch_swa b/services/registration/pin_reset_mismatch_swa deleted file mode 100644 index 5787790..0000000 --- a/services/registration/pin_reset_mismatch_swa +++ /dev/null @@ -1 +0,0 @@ -PIN uliyoweka hailingani.Jaribu tena. \ No newline at end of file From 29d94bb2e514331b16e6c6af7f325432b63f182c Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:57:22 +0300 Subject: [PATCH 106/182] have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked --- services/registration/root.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/root.vis b/services/registration/root.vis index 923caef..ec5b54e 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -6,10 +6,10 @@ CATCH self_reset_pin flag_account_pin_reset 1 CATCH blocked_account flag_account_blocked 1 CATCH select_language flag_language_set 0 CATCH terms flag_account_created 0 +CATCH create_pin flag_pin_set 0 LOAD check_account_status 0 RELOAD check_account_status CATCH api_failure flag_api_call_error 1 CATCH account_pending flag_account_pending 1 -CATCH create_pin flag_pin_set 0 CATCH main flag_account_success 1 HALT From 0c1d9ab58232b86b71f2408f913c10ea003b28e5 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:58:13 +0300 Subject: [PATCH 107/182] updated the description of the flag_incorrect_pin --- services/registration/pp.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/pp.csv b/services/registration/pp.csv index dec5b42..ff26614 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -9,7 +9,7 @@ flag,flag_account_authorized,15,this is set to allow a user access guarded nodes flag,flag_invalid_recipient,16,this is set when the transaction recipient is invalid flag,flag_invalid_recipient_with_invite,17,this is set when the transaction recipient is valid but not on the platform flag,flag_invalid_amount,18,this is set when the given transaction amount is invalid -flag,flag_incorrect_pin,19,this is set when the provided PIN is invalid or does not match the current account's PIN +flag,flag_incorrect_pin,19,this is set when the provided PIN does not match the current account's PIN flag,flag_valid_pin,20,this is set when the given PIN is valid flag,flag_allow_update,21,this is set to allow a user to update their profile data flag,flag_single_edit,22,this is set to allow a user to edit a single profile item such as year of birth From 1f6bf2bbed2daa33194e479eed442e78cd144561 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:59:48 +0300 Subject: [PATCH 108/182] updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin --- handlers/application/menuhandler.go | 38 +++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 1abb5ce..69a681d 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -383,15 +383,20 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ return res, fmt.Errorf("missing session") } - flag_incorrect_pin, _ := h.flagManager.GetFlag("flag_incorrect_pin") - accountPIN := string(input) + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") - // Validate that the PIN is a 4-digit number. - if !pin.IsValidPIN(accountPIN) { - res.FlagSet = append(res.FlagSet, flag_incorrect_pin) + if string(input) == "0" { return res, nil } - res.FlagReset = append(res.FlagReset, flag_incorrect_pin) + + accountPIN := string(input) + + // Validate that the PIN has a valid format. + if !pin.IsValidPIN(accountPIN) { + res.FlagSet = append(res.FlagSet, flag_invalid_pin) + return res, nil + } + res.FlagReset = append(res.FlagReset, flag_invalid_pin) // Hash the PIN hashedPIN, err := pin.HashPIN(string(accountPIN)) @@ -693,14 +698,20 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") - flag_pin_set, _ := h.flagManager.GetFlag("flag_pin_set") - sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") } + + flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") + flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") + flag_pin_set, _ := h.flagManager.GetFlag("flag_pin_set") + + if string(input) == "0" { + res.FlagReset = append(res.FlagReset, flag_pin_mismatch) + return res, nil + } + store := h.userdataStore hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { @@ -713,14 +724,15 @@ func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input [] } if pin.VerifyPIN(string(hashedTemporaryPin), string(input)) { - res.FlagSet = []uint32{flag_valid_pin} - res.FlagReset = []uint32{flag_pin_mismatch} + res.FlagSet = append(res.FlagSet, flag_valid_pin) res.FlagSet = append(res.FlagSet, flag_pin_set) + res.FlagReset = append(res.FlagReset, flag_pin_mismatch) } else { - res.FlagSet = []uint32{flag_pin_mismatch} + res.FlagSet = append(res.FlagSet, flag_pin_mismatch) return res, nil } + // save the hashed PIN as the new account PIN err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) if err != nil { logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) From 26353bdf6e632ef8013f515ce8f117f52c5c90a5 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:34:24 +0300 Subject: [PATCH 109/182] add a space --- services/registration/invalid_pin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/invalid_pin b/services/registration/invalid_pin index 607c151..a5031af 100644 --- a/services/registration/invalid_pin +++ b/services/registration/invalid_pin @@ -1 +1 @@ -The PIN you entered is invalid.The PIN must be a 4 digit number. \ No newline at end of file +The PIN you entered is invalid. The PIN must be a 4 digit number. \ No newline at end of file From 834f2ce629af708311e89e7bb0b9742a1163fe59 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:39:41 +0300 Subject: [PATCH 110/182] remove code related to admins resetting a user's actual PIN --- handlers/application/menuhandler.go | 81 --------- handlers/application/menuhandler_test.go | 167 ------------------ handlers/local.go | 2 - services/registration/confirm_others_new_pin | 1 - .../registration/confirm_others_new_pin.vis | 14 -- .../registration/confirm_others_new_pin_swa | 1 - services/registration/enter_others_new_pin | 1 - .../registration/enter_others_new_pin.vis | 9 - .../registration/enter_others_new_pin_swa | 1 - services/registration/invalid_others_pin | 1 - services/registration/invalid_others_pin.vis | 5 - services/registration/others_pin_mismatch | 1 - services/registration/others_pin_mismatch.vis | 6 - services/registration/others_pin_mismatch_swa | 1 - 14 files changed, 291 deletions(-) delete mode 100644 services/registration/confirm_others_new_pin delete mode 100644 services/registration/confirm_others_new_pin.vis delete mode 100644 services/registration/confirm_others_new_pin_swa delete mode 100644 services/registration/enter_others_new_pin delete mode 100644 services/registration/enter_others_new_pin.vis delete mode 100644 services/registration/enter_others_new_pin_swa delete mode 100644 services/registration/invalid_others_pin delete mode 100644 services/registration/invalid_others_pin.vis delete mode 100644 services/registration/others_pin_mismatch delete mode 100644 services/registration/others_pin_mismatch.vis delete mode 100644 services/registration/others_pin_mismatch_swa diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 69a681d..bf0a42e 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -415,87 +415,6 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ return res, nil } -// SaveOthersTemporaryPin allows authorized users to set temporary PINs for blocked numbers. -func (h *MenuHandlers) SaveOthersTemporaryPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error - - store := h.userdataStore - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - - temporaryPin := string(input) - - // Validate that the input is a 4-digit number. - if !pin.IsValidPIN(temporaryPin) { - return res, nil - } - - // Retrieve the blocked number associated with this session - blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) - return res, err - } - - // Hash the temporary PIN - hashedPIN, err := pin.HashPIN(string(temporaryPin)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to hash temporaryPin", "error", err) - return res, err - } - - // Save the hashed temporary PIN for that blocked number - err = store.WriteEntry(ctx, string(blockedNumber), storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write hashed temporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", temporaryPin, "error", err) - return res, err - } - - return res, nil -} - -// CheckBlockedNumPinMisMatch checks if the provided PIN matches a temporary PIN stored for a blocked number. -func (h *MenuHandlers) CheckBlockedNumPinMisMatch(ctx context.Context, sym string, input []byte) (resource.Result, error) { - res := resource.Result{} - flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - if string(input) == "0" { - res.FlagReset = append(res.FlagReset, flag_pin_mismatch) - return res, nil - } - - // Get blocked number from storage. - store := h.userdataStore - blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) - return res, err - } - // Get Hashed temporary PIN for the blocked number. - hashedTemporaryPin, err := store.ReadEntry(ctx, string(blockedNumber), storedb.DATA_TEMPORARY_VALUE) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) - return res, err - } - if len(hashedTemporaryPin) == 0 { - logg.ErrorCtxf(ctx, "hashedTemporaryPin is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") - } - - if pin.VerifyPIN(string(hashedTemporaryPin), string(input)) { - res.FlagReset = append(res.FlagReset, flag_pin_mismatch) - } else { - res.FlagSet = append(res.FlagSet, flag_pin_mismatch) - } - return res, nil -} - // ResetInvalidPIN resets the invalid PIN flag func (h *MenuHandlers) ResetInvalidPIN(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 6c5f5a2..ddaf88a 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2906,173 +2906,6 @@ func TestValidateBlockedNumber(t *testing.T) { } } -func TestSaveOthersTemporaryPin(t *testing.T) { - sessionId := "session123" - blockedNumber := "+254712345678" - testPin := "1234" - - ctx, userStore := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - h := &MenuHandlers{ - userdataStore: userStore, - } - - tests := []struct { - name string - sessionId string - blockedNumber string - testPin string - setup func() error // Setup function for each test case - expectedError bool - verifyResult func(t *testing.T) // Function to verify the result - }{ - { - name: "Missing Session ID", - sessionId: "", // Empty session ID - blockedNumber: blockedNumber, - testPin: testPin, - setup: nil, - expectedError: true, - verifyResult: nil, - }, - { - name: "Failed to Read Blocked Number", - sessionId: sessionId, - blockedNumber: blockedNumber, - testPin: testPin, - setup: func() error { - // Do not write the blocked number to simulate a read failure - return nil - }, - expectedError: true, - verifyResult: nil, - }, - - { - name: "Successfully save hashed PIN", - sessionId: sessionId, - blockedNumber: blockedNumber, - testPin: testPin, - setup: func() error { - // Write the blocked number to the store - return userStore.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(blockedNumber)) - }, - expectedError: false, - verifyResult: func(t *testing.T) { - // Read the stored hashed PIN - othersHashedPin, err := userStore.ReadEntry(ctx, blockedNumber, storedb.DATA_TEMPORARY_VALUE) - if err != nil { - t.Fatal(err) - } - - // Verify that the stored hashed PIN matches the original PIN - if !pin.VerifyPIN(string(othersHashedPin), testPin) { - t.Fatal("stored hashed PIN does not match the original PIN") - } - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // Set up the context with the session ID - ctx := context.WithValue(context.Background(), "SessionId", tt.sessionId) - - // Run the setup function if provided - if tt.setup != nil { - err := tt.setup() - if err != nil { - t.Fatal(err) - } - } - - // Call the function under test - _, err := h.SaveOthersTemporaryPin(ctx, "save_others_temporary_pin", []byte(tt.testPin)) - - // Assert the error - if tt.expectedError { - assert.Error(t, err) - } else { - assert.NoError(t, err) - } - - // Verify the result if a verification function is provided - if tt.verifyResult != nil { - tt.verifyResult(t) - } - }) - } -} - -func TestCheckBlockedNumPinMisMatch(t *testing.T) { - sessionId := "session123" - blockedNumber := "+254712345678" - testPin := "1234" - mockState := state.NewState(128) - - ctx, userStore := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - hashedPIN, err := pin.HashPIN(testPin) - if err != nil { - logg.ErrorCtxf(ctx, "failed to hash testPin", "error", err) - t.Fatal(err) - } - - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Fatal(err) - } - flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch") - - h := &MenuHandlers{ - userdataStore: userStore, - st: mockState, - flagManager: fm, - } - - // Write initial data to the store - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(blockedNumber)) - if err != nil { - t.Fatal(err) - } - err = userStore.WriteEntry(ctx, blockedNumber, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) - if err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - input []byte - expectedResult resource.Result - }{ - { - name: "Successful PIN match", - input: []byte(testPin), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_pin_mismatch}, - }, - }, - { - name: "PIN mismatch", - input: []byte("1345"), - expectedResult: resource.Result{ - FlagSet: []uint32{flag_pin_mismatch}, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - res, err := h.CheckBlockedNumPinMisMatch(ctx, "sym", tt.input) - - assert.NoError(t, err) - assert.Equal(t, tt.expectedResult, res) - }) - } -} - func TestGetCurrentProfileInfo(t *testing.T) { sessionId := "session123" ctx, store := InitializeTestStore(t) diff --git a/handlers/local.go b/handlers/local.go index 43b0bb5..507a79c 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -110,12 +110,10 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher) ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails) ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin) - ls.DbRs.AddLocalFunc("check_pin_mismatch", appHandlers.CheckBlockedNumPinMisMatch) ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber) ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber) ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber) ls.DbRs.AddLocalFunc("reset_others_pin", appHandlers.ResetOthersPin) - ls.DbRs.AddLocalFunc("save_others_temporary_pin", appHandlers.SaveOthersTemporaryPin) ls.DbRs.AddLocalFunc("get_current_profile_info", appHandlers.GetCurrentProfileInfo) ls.DbRs.AddLocalFunc("check_transactions", appHandlers.CheckTransactions) ls.DbRs.AddLocalFunc("get_transactions", appHandlers.GetTransactionsList) diff --git a/services/registration/confirm_others_new_pin b/services/registration/confirm_others_new_pin deleted file mode 100644 index 720778b..0000000 --- a/services/registration/confirm_others_new_pin +++ /dev/null @@ -1 +0,0 @@ -Please confirm new PIN for: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/confirm_others_new_pin.vis b/services/registration/confirm_others_new_pin.vis deleted file mode 100644 index 50dfb19..0000000 --- a/services/registration/confirm_others_new_pin.vis +++ /dev/null @@ -1,14 +0,0 @@ -CATCH incorrect_pin flag_incorrect_pin 1 -RELOAD retrieve_blocked_number -MAP retrieve_blocked_number -CATCH invalid_others_pin flag_valid_pin 0 -CATCH pin_reset_result flag_account_authorized 1 -LOAD save_others_temporary_pin 6 -RELOAD save_others_temporary_pin -MOUT back 0 -HALT -INCMP _ 0 -LOAD check_pin_mismatch 6 -RELOAD check_pin_mismatch -CATCH others_pin_mismatch flag_pin_mismatch 1 -INCMP pin_entry * diff --git a/services/registration/confirm_others_new_pin_swa b/services/registration/confirm_others_new_pin_swa deleted file mode 100644 index f0b09c8..0000000 --- a/services/registration/confirm_others_new_pin_swa +++ /dev/null @@ -1 +0,0 @@ -Tafadhali thibitisha PIN mpya ya: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/enter_others_new_pin b/services/registration/enter_others_new_pin deleted file mode 100644 index 52ae664..0000000 --- a/services/registration/enter_others_new_pin +++ /dev/null @@ -1 +0,0 @@ -Please enter new PIN for: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/enter_others_new_pin.vis b/services/registration/enter_others_new_pin.vis deleted file mode 100644 index 3f8a5c6..0000000 --- a/services/registration/enter_others_new_pin.vis +++ /dev/null @@ -1,9 +0,0 @@ -LOAD retrieve_blocked_number 0 -RELOAD retrieve_blocked_number -MAP retrieve_blocked_number -MOUT back 0 -HALT -LOAD verify_new_pin 6 -RELOAD verify_new_pin -INCMP _ 0 -INCMP * confirm_others_new_pin diff --git a/services/registration/enter_others_new_pin_swa b/services/registration/enter_others_new_pin_swa deleted file mode 100644 index 77ec2f3..0000000 --- a/services/registration/enter_others_new_pin_swa +++ /dev/null @@ -1 +0,0 @@ -Tafadhali weka PIN mpya ya: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/invalid_others_pin b/services/registration/invalid_others_pin deleted file mode 100644 index acdf45f..0000000 --- a/services/registration/invalid_others_pin +++ /dev/null @@ -1 +0,0 @@ -The PIN you have entered is invalid.Please try a 4 digit number instead. \ No newline at end of file diff --git a/services/registration/invalid_others_pin.vis b/services/registration/invalid_others_pin.vis deleted file mode 100644 index d218e6d..0000000 --- a/services/registration/invalid_others_pin.vis +++ /dev/null @@ -1,5 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP enter_others_new_pin 1 -INCMP quit 9 diff --git a/services/registration/others_pin_mismatch b/services/registration/others_pin_mismatch deleted file mode 100644 index deb9fe5..0000000 --- a/services/registration/others_pin_mismatch +++ /dev/null @@ -1 +0,0 @@ -The PIN you have entered is not a match diff --git a/services/registration/others_pin_mismatch.vis b/services/registration/others_pin_mismatch.vis deleted file mode 100644 index b2421aa..0000000 --- a/services/registration/others_pin_mismatch.vis +++ /dev/null @@ -1,6 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP _ 1 -INCMP quit 9 -INCMP . * diff --git a/services/registration/others_pin_mismatch_swa b/services/registration/others_pin_mismatch_swa deleted file mode 100644 index 5787790..0000000 --- a/services/registration/others_pin_mismatch_swa +++ /dev/null @@ -1 +0,0 @@ -PIN uliyoweka hailingani.Jaribu tena. \ No newline at end of file From 35a2732fe2dd60a8d825d03d8cfa1983fa8d90d9 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:52:18 +0300 Subject: [PATCH 111/182] updated the menu flow for the admin reset others PIN in test --- menutraversal_test/group_test.json | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index b3177a9..c5dc3a2 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -202,23 +202,7 @@ }, { "input": "0700000000", - "expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "11111", - "expectedContent": "The PIN you have entered is invalid.Please try a 4 digit number instead.\n1:Retry\n9:Quit" - }, - { - "input": "1", - "expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "1111", - "expectedContent": "Please confirm new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "1111", - "expectedContent": "Please enter your PIN:" + "expectedContent": "{secondary_session_id} will get a PIN reset request.\nPlease enter your PIN to confirm:\n0:Back\n9:Quit" }, { "input": "1234", From a27d44e56116916ef20bd02e480980f1cd8bc2a7 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:52:58 +0300 Subject: [PATCH 112/182] updated the expected content for the alias in view profile --- menutraversal_test/group_test.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index c5dc3a2..38c382e 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -596,7 +596,7 @@ }, { "input": "1234", - "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit" + "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit" }, { "input": "0", From 1076a9578e96388ef89e78cbbf94f321155e1528 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:57:54 +0300 Subject: [PATCH 113/182] use the correct flag_invalid_pin in TestSaveTemporaryPin --- handlers/application/menuhandler_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index ddaf88a..893ca42 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -566,7 +566,7 @@ func TestSaveTemporaryPin(t *testing.T) { log.Fatal(err) } - flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin") + flag_invalid_pin, _ := fm.GetFlag("flag_invalid_pin") // Create the MenuHandlers instance with the mock flag manager h := &MenuHandlers{ @@ -584,14 +584,14 @@ func TestSaveTemporaryPin(t *testing.T) { name: "Valid Pin entry", input: []byte("1234"), expectedResult: resource.Result{ - FlagReset: []uint32{flag_incorrect_pin}, + FlagReset: []uint32{flag_invalid_pin}, }, }, { name: "Invalid Pin entry", input: []byte("12343"), expectedResult: resource.Result{ - FlagSet: []uint32{flag_incorrect_pin}, + FlagSet: []uint32{flag_invalid_pin}, }, }, } From 4ef8c47f8b829b3b9c53986ae8172262682e0d84 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:01:40 +0300 Subject: [PATCH 114/182] update the reset flags in TestConfirmPinChange --- handlers/application/menuhandler_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 893ca42..83aa6be 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1889,7 +1889,7 @@ func TestVerifyNewPin(t *testing.T) { } } -func TestConfirmPin(t *testing.T) { +func TestConfirmPinChange(t *testing.T) { sessionId := "session123" mockState := state.NewState(16) @@ -1898,6 +1898,8 @@ func TestConfirmPin(t *testing.T) { fm, _ := NewFlagManager(flagsPath) flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch") + flag_account_pin_reset, _ := fm.GetFlag("flag_account_pin_reset") + mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ userdataStore: store, @@ -1917,7 +1919,7 @@ func TestConfirmPin(t *testing.T) { input: []byte("1234"), temporarypin: "1234", expectedResult: resource.Result{ - FlagReset: []uint32{flag_pin_mismatch}, + FlagReset: []uint32{flag_pin_mismatch, flag_account_pin_reset}, }, }, } From b89abf3487aa14d55bbd900b481726e41b60bbfd Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:06:24 +0300 Subject: [PATCH 115/182] update the reset flags in TestCheckBlockedStatus --- handlers/application/menuhandler_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 83aa6be..8547401 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2355,10 +2355,8 @@ func TestCheckBlockedStatus(t *testing.T) { if err != nil { t.Logf(err.Error()) } - flag_account_blocked, err := fm.GetFlag("flag_account_blocked") - if err != nil { - t.Logf(err.Error()) - } + flag_account_blocked, _ := fm.GetFlag("flag_account_blocked") + flag_account_pin_reset, _ := fm.GetFlag("flag_account_pin_reset") h := &MenuHandlers{ userdataStore: store, @@ -2373,13 +2371,15 @@ func TestCheckBlockedStatus(t *testing.T) { { name: "Currently blocked account", currentWrongPinAttempts: "4", - expectedResult: resource.Result{}, + expectedResult: resource.Result{ + FlagReset: []uint32{flag_account_pin_reset}, + }, }, { name: "Account with 0 wrong PIN attempts", currentWrongPinAttempts: "0", expectedResult: resource.Result{ - FlagReset: []uint32{flag_account_blocked}, + FlagReset: []uint32{flag_account_pin_reset, flag_account_blocked}, }, }, } From 69ae494b2c4daaafa234dce458bb0c6a2f5410ab Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:10:51 +0300 Subject: [PATCH 116/182] update the order for the INCMP statement --- services/registration/confirm_pin_change.vis | 2 +- services/registration/new_pin.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 6e50c11..2077d23 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -4,4 +4,4 @@ HALT INCMP _ 0 RELOAD confirm_pin_change CATCH pin_mismatch flag_pin_mismatch 1 -INCMP * pin_reset_success +INCMP pin_reset_success * \ No newline at end of file diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 56705d7..59e71e4 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -4,4 +4,4 @@ INCMP _ 0 RELOAD save_temporary_pin RELOAD verify_new_pin CATCH invalid_pin flag_valid_pin 0 -INCMP * confirm_pin_change +INCMP confirm_pin_change * From 6070792fe4071762d8561ee9bd3a96c1767b91a7 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:14:10 +0300 Subject: [PATCH 117/182] cleanup: remove extra space --- services/registration/amount.vis | 2 +- services/registration/community_balance.vis | 2 +- services/registration/confirm_new_alias.vis | 2 +- services/registration/my_balance.vis | 2 +- services/registration/root.vis | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/registration/amount.vis b/services/registration/amount.vis index 10d4430..c50691f 100644 --- a/services/registration/amount.vis +++ b/services/registration/amount.vis @@ -6,7 +6,7 @@ MOUT back 0 HALT LOAD validate_amount 64 RELOAD validate_amount -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 CATCH invalid_amount flag_invalid_amount 1 INCMP _ 0 LOAD get_recipient 0 diff --git a/services/registration/community_balance.vis b/services/registration/community_balance.vis index fad90cc..a748685 100644 --- a/services/registration/community_balance.vis +++ b/services/registration/community_balance.vis @@ -1,6 +1,6 @@ LOAD reset_incorrect 6 LOAD fetch_community_balance 0 -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 MAP fetch_community_balance CATCH incorrect_pin flag_incorrect_pin 1 CATCH pin_entry flag_account_authorized 0 diff --git a/services/registration/confirm_new_alias.vis b/services/registration/confirm_new_alias.vis index ad56fe0..ea79412 100644 --- a/services/registration/confirm_new_alias.vis +++ b/services/registration/confirm_new_alias.vis @@ -8,5 +8,5 @@ HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH invalid_pin flag_invalid_pin 1 +CATCH invalid_pin flag_invalid_pin 1 CATCH update_alias flag_allow_update 1 diff --git a/services/registration/my_balance.vis b/services/registration/my_balance.vis index b6094c0..166d18f 100644 --- a/services/registration/my_balance.vis +++ b/services/registration/my_balance.vis @@ -1,6 +1,6 @@ LOAD reset_incorrect 6 LOAD check_balance 0 -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 MAP check_balance CATCH incorrect_pin flag_incorrect_pin 1 CATCH pin_entry flag_account_authorized 0 diff --git a/services/registration/root.vis b/services/registration/root.vis index ec5b54e..035db83 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -9,7 +9,7 @@ CATCH terms flag_account_created 0 CATCH create_pin flag_pin_set 0 LOAD check_account_status 0 RELOAD check_account_status -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 CATCH account_pending flag_account_pending 1 CATCH main flag_account_success 1 HALT From 0337c66f968328271d533628410787aaa763f681 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:17:59 +0300 Subject: [PATCH 118/182] cleanup: remove extra space in all .vis files --- services/registration/my_account_alias.vis | 2 +- services/registration/old_pin.vis | 2 +- services/registration/pin_reset_result.vis | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/registration/my_account_alias.vis b/services/registration/my_account_alias.vis index 506f432..b2c48f8 100644 --- a/services/registration/my_account_alias.vis +++ b/services/registration/my_account_alias.vis @@ -5,4 +5,4 @@ HALT INCMP _ 0 LOAD request_custom_alias 0 RELOAD request_custom_alias -INCMP confirm_new_alias * +INCMP confirm_new_alias * diff --git a/services/registration/old_pin.vis b/services/registration/old_pin.vis index de66e2c..ccc2928 100644 --- a/services/registration/old_pin.vis +++ b/services/registration/old_pin.vis @@ -4,5 +4,5 @@ HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH invalid_pin flag_invalid_pin 1 +CATCH invalid_pin flag_invalid_pin 1 INCMP new_pin * diff --git a/services/registration/pin_reset_result.vis b/services/registration/pin_reset_result.vis index a676198..3412473 100644 --- a/services/registration/pin_reset_result.vis +++ b/services/registration/pin_reset_result.vis @@ -6,4 +6,4 @@ MOUT back 0 MOUT quit 9 HALT INCMP ^ 0 -INCMP quit 9 +INCMP quit 9 From d680387ef1e188f02fb2ec5fcd26c154436cf3be Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:21:35 +0300 Subject: [PATCH 119/182] use the same check for flag_invalid_pin to move to the invalid_pin node --- services/registration/new_pin.vis | 2 +- services/registration/self_reset_pin.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 59e71e4..54f23ec 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -3,5 +3,5 @@ HALT INCMP _ 0 RELOAD save_temporary_pin RELOAD verify_new_pin -CATCH invalid_pin flag_valid_pin 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index 3439fcd..bb0adeb 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -4,5 +4,5 @@ LOAD save_temporary_pin 1 RELOAD save_temporary_pin LOAD verify_new_pin 2 RELOAD verify_new_pin -CATCH invalid_pin flag_valid_pin 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_self_pin_reset * From aec1f4c4c1af518a2088f5c2e1b306cd57eeb5c9 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:23:46 +0300 Subject: [PATCH 120/182] use a single confirm_pin_change node --- services/registration/confirm_pin_change.vis | 4 ++-- services/registration/confirm_self_pin_reset | 1 - services/registration/confirm_self_pin_reset.vis | 7 ------- services/registration/confirm_self_pin_reset_swa | 1 - services/registration/self_reset_pin.vis | 2 +- 5 files changed, 3 insertions(+), 12 deletions(-) delete mode 100644 services/registration/confirm_self_pin_reset delete mode 100644 services/registration/confirm_self_pin_reset.vis delete mode 100644 services/registration/confirm_self_pin_reset_swa diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 2077d23..419662b 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -1,7 +1,7 @@ -LOAD confirm_pin_change 0 MOUT back 0 HALT INCMP _ 0 +LOAD confirm_pin_change 0 RELOAD confirm_pin_change CATCH pin_mismatch flag_pin_mismatch 1 -INCMP pin_reset_success * \ No newline at end of file +INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset b/services/registration/confirm_self_pin_reset deleted file mode 100644 index 2e1b83e..0000000 --- a/services/registration/confirm_self_pin_reset +++ /dev/null @@ -1 +0,0 @@ -Confirm your new PIN: \ No newline at end of file diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis deleted file mode 100644 index 419662b..0000000 --- a/services/registration/confirm_self_pin_reset.vis +++ /dev/null @@ -1,7 +0,0 @@ -MOUT back 0 -HALT -INCMP _ 0 -LOAD confirm_pin_change 0 -RELOAD confirm_pin_change -CATCH pin_mismatch flag_pin_mismatch 1 -INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset_swa b/services/registration/confirm_self_pin_reset_swa deleted file mode 100644 index e407fec..0000000 --- a/services/registration/confirm_self_pin_reset_swa +++ /dev/null @@ -1 +0,0 @@ -Thibitisha PIN yako mpya: \ No newline at end of file diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index bb0adeb..5fa328f 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -5,4 +5,4 @@ RELOAD save_temporary_pin LOAD verify_new_pin 2 RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 -INCMP confirm_self_pin_reset * +INCMP confirm_pin_change * From 7d9c3b66a9eae203b2b354aca4747decd19008bc Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:29:40 +0300 Subject: [PATCH 121/182] remove unused function reset_valid_pin --- handlers/application/menuhandler.go | 8 -------- handlers/application/menuhandler_test.go | 24 ------------------------ handlers/local.go | 1 - 3 files changed, 33 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index bf0a42e..19cc266 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -265,14 +265,6 @@ func (h *MenuHandlers) CheckAccountCreated(ctx context.Context, sym string, inpu return res, nil } -// ResetValidPin resets the flag_valid_pin flag. -func (h *MenuHandlers) ResetValidPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - res.FlagReset = append(res.FlagReset, flag_valid_pin) - return res, nil -} - // CheckBlockedStatus: // 1. Checks whether the DATA_SELF_PIN_RESET is 1 and sets the flag_account_pin_reset // 2. resets the account blocked flag if the PIN attempts have been reset by an admin. diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 8547401..d903efc 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -3064,30 +3064,6 @@ func TestResetOthersPin(t *testing.T) { assert.NoError(t, err) } -func TestResetValidPin(t *testing.T) { - ctx := context.Background() - - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Fatal(err) - } - flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") - - expectedResult := resource.Result{ - FlagReset: []uint32{flag_valid_pin}, - } - - h := &MenuHandlers{ - flagManager: fm, - } - - res, err := h.ResetValidPin(ctx, "reset_valid_pin", []byte("")) - - assert.NoError(t, err) - - assert.Equal(t, expectedResult, res) -} - func TestResetUnregisteredNumber(t *testing.T) { ctx := context.Background() diff --git a/handlers/local.go b/handlers/local.go index 507a79c..46a887c 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -109,7 +109,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher) ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher) ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails) - ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin) ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber) ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber) ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber) From 57a1645c03b00118d1d0dd1ed5d9220ddab482ba Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 23:40:03 +0300 Subject: [PATCH 122/182] remove the verify_new_pin functionality that managed the unused flag_valid_pin --- handlers/application/menuhandler.go | 23 ------------ handlers/application/menuhandler_test.go | 46 ------------------------ handlers/local.go | 1 - services/registration/new_pin.vis | 1 - services/registration/pin_management.vis | 1 - services/registration/self_reset_pin.vis | 2 -- 6 files changed, 74 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 19cc266..b1e8109 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -340,29 +340,6 @@ func (h *MenuHandlers) ResetIncorrectPin(ctx context.Context, sym string, input return res, nil } -// VerifyNewPin checks if a new PIN meets the required format criteria. -func (h *MenuHandlers) VerifyNewPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - res := resource.Result{} - _, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - if string(input) != "0" { - pinInput := string(input) - // Validate that the PIN is a 4-digit number. - if pin.IsValidPIN(pinInput) { - res.FlagSet = append(res.FlagSet, flag_valid_pin) - } else { - res.FlagReset = append(res.FlagReset, flag_valid_pin) - } - } else { - res.FlagSet = append(res.FlagSet, flag_valid_pin) - } - - return res, nil -} - // SaveTemporaryPin saves the valid PIN input to the DATA_TEMPORARY_VALUE, // during the account creation process // and during the change PIN process. diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index d903efc..9a7bc75 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1843,52 +1843,6 @@ func TestGetProfile(t *testing.T) { } } -func TestVerifyNewPin(t *testing.T) { - sessionId := "session123" - - fm, _ := NewFlagManager(flagsPath) - mockState := state.NewState(16) - - flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") - mockAccountService := new(mocks.MockAccountService) - h := &MenuHandlers{ - flagManager: fm, - accountService: mockAccountService, - st: mockState, - } - ctx := context.WithValue(context.Background(), "SessionId", sessionId) - - tests := []struct { - name string - input []byte - expectedResult resource.Result - }{ - { - name: "Test with valid pin", - input: []byte("1234"), - expectedResult: resource.Result{ - FlagSet: []uint32{flag_valid_pin}, - }, - }, - { - name: "Test with invalid pin", - input: []byte("123"), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_valid_pin}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - //Call the function under test - res, _ := h.VerifyNewPin(ctx, "verify_new_pin", tt.input) - - //Assert that the result set to content is what was expected - assert.Equal(t, res, tt.expectedResult, "Result should contain flags set according to user input") - }) - } -} - func TestConfirmPinChange(t *testing.T) { sessionId := "session123" diff --git a/handlers/local.go b/handlers/local.go index 46a887c..51f4208 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -99,7 +99,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("verify_yob", appHandlers.VerifyYob) ls.DbRs.AddLocalFunc("reset_incorrect_date_format", appHandlers.ResetIncorrectYob) ls.DbRs.AddLocalFunc("initiate_transaction", appHandlers.InitiateTransaction) - ls.DbRs.AddLocalFunc("verify_new_pin", appHandlers.VerifyNewPin) ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange) ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp) ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance) diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 54f23ec..79e95ea 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -2,6 +2,5 @@ MOUT back 0 HALT INCMP _ 0 RELOAD save_temporary_pin -RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * diff --git a/services/registration/pin_management.vis b/services/registration/pin_management.vis index ca54ee4..01bd236 100644 --- a/services/registration/pin_management.vis +++ b/services/registration/pin_management.vis @@ -1,7 +1,6 @@ LOAD set_back 6 LOAD authorize_account 16 LOAD reset_allow_update 4 -LOAD verify_new_pin 2 LOAD save_temporary_pin 1 LOAD reset_incorrect 0 LOAD reset_invalid_pin 6 diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index 5fa328f..401a4e0 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -2,7 +2,5 @@ LOAD reset_invalid_pin 6 HALT LOAD save_temporary_pin 1 RELOAD save_temporary_pin -LOAD verify_new_pin 2 -RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * From 56cda36aa752d32653249fee5f0d2b088e838889 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 10 Apr 2025 13:55:00 +0300 Subject: [PATCH 123/182] updated the description of DATA_SELF_PIN_RESET --- store/db/db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/db/db.go b/store/db/db.go index f7f7013..517d0a0 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -65,7 +65,7 @@ const ( DATA_ACCOUNT_ALIAS //currently suggested alias by the api awaiting user's confirmation as accepted account alias DATA_SUGGESTED_ALIAS - //currently suggested alias by the api awaiting user's confirmation as accepted account alias + //Key used to store a value of 1 for a user to reset their own PIN once they access the menu. DATA_SELF_PIN_RESET ) From 42177aadeb16e6e5b8cc71821be1ccc9b8bd72b7 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 11 Apr 2025 11:10:48 +0300 Subject: [PATCH 124/182] use latest commit from sarafu-api --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index f62c330..07477f6 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 533f2fe..2fcf7b7 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From f127fd7c0fabf8605bf60af394605db04737deaf Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 14 Apr 2025 11:34:37 +0300 Subject: [PATCH 125/182] initialize log db ,attach it to the menuhandler --- cmd/africastalking/main.go | 8 ++++++++ cmd/main.go | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/cmd/africastalking/main.go b/cmd/africastalking/main.go index 3f7e372..2f34b56 100644 --- a/cmd/africastalking/main.go +++ b/cmd/africastalking/main.go @@ -44,6 +44,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -55,6 +56,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -100,6 +102,11 @@ func main() { fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err) os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } dbResource, ok := rs.(*resource.DbResource) if !ok { @@ -113,6 +120,7 @@ func main() { os.Exit(1) } lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) if err != nil { fmt.Fprintf(os.Stderr, "setdatastore: %v\n", err) os.Exit(1) diff --git a/cmd/main.go b/cmd/main.go index a18bfab..1b40e32 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -36,6 +36,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -46,6 +47,7 @@ func main() { flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -110,6 +112,12 @@ func main() { os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdatastore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { fmt.Fprintf(os.Stderr, "get dbresource error: %v\n", err) @@ -118,6 +126,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdatastore) + lhs.SetLogDb(&logdb) lhs.SetPersister(pe) if err != nil { fmt.Fprintf(os.Stderr, "localhandler service error: %v\n", err) From e1a3729e3bb4066eaf0c0b3bfd43dbf629b9689e Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 17 Apr 2025 14:31:18 +0300 Subject: [PATCH 126/182] use the updated phone and alias regexes from common --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 07477f6..7e6025c 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 - git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d + git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 diff --git a/go.sum b/go.sum index 2fcf7b7..9e24620 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 h1:FnT39aqXcP5YW git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= +git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= +git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= From cea920c1f506df053343a071e64dd94241f6ffff Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:30:54 +0300 Subject: [PATCH 127/182] dep: upgrade sarafu-api dep to include address and pin reset sms --- go.mod | 2 +- go.sum | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 7e6025c..490fc8d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 9e24620..98ae1c9 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,14 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1 h1:Yt9S+9JtCB4Y6jw6Xo1WGoVVu591n3/tSRIwM3kw1uY= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028 h1:HuIL9BClNieD7QCikCW1sJ9HyIo9iqRDFqULJGHxbrM= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b h1:0Ldq9SKqu+oNljNaKpQFyUgl3cOi6LJulGZwf5vXuWo= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c h1:fO8NGQ/sLdwpbi3UWzZZxqOXGrEzMVXyxER5ziGuZLI= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 08deeca500ca4b47bbf3be1be8337c6ef856137c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:31:22 +0300 Subject: [PATCH 128/182] register handler to trigger address sms --- handlers/local.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/local.go b/handlers/local.go index 6f4963f..870a50e 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,6 +124,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) + ls.DbRs.AddLocalFunc("send_address_sms", appHandlers.SendAddressSMS) ls.first = appHandlers.Init From 5ff2e794ff98e1c1802ec4a3d3efb7082e7065ec Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:31:48 +0300 Subject: [PATCH 129/182] feat: implement address and pin reset sms --- handlers/application/menuhandler.go | 70 ++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 615f500..03631ad 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -524,7 +524,15 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "failed to reset incorrect PIN attempts", "key", storedb.DATA_INCORRECT_PIN_ATTEMPTS, "error", err) return res, err } - + blockedPhoneStr := string(blockedPhonenumber) + //Trigger an SMS to inform a user that the blocked account has been reset + if phone.IsValidPhoneNumber(blockedPhoneStr) { + err = h.sendPINResetSMS(ctx, sessionId, blockedPhoneStr) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send PIN reset SMS", "error", err) + return res, nil + } + } return res, nil } @@ -2491,3 +2499,63 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } return res, nil } + +// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. +func (h *MenuHandlers) SendAddressSMS(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + store := h.userdataStore + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return res, err + } + originPhone, err := phone.FormatPhoneNumber(sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) + return res, nil + } + + if !phone.IsValidPhoneNumber(originPhone) { + logg.InfoCtxf(ctx, "Invalid origin phone number", "sessionid:", sessionId) + return res, nil + } + err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) + return res, nil + } + return res, nil +} + +// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. +func (h *MenuHandlers) sendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { + formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format admin phone number: %w", err) + } + + formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format blocked phone number: %w", err) + } + + if !phone.IsValidPhoneNumber(formattedAdminPhone) { + return fmt.Errorf("invalid admin phone number") + } + if !phone.IsValidPhoneNumber(formattedBlockedPhone) { + return fmt.Errorf("invalid blocked phone number") + } + + err = h.accountService.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) + if err != nil { + return fmt.Errorf("failed to send pin reset sms: %v", err) + } + + return nil +} From 0274133d4892e5b766bc5767c89f7b5aad6f4647 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:32:05 +0300 Subject: [PATCH 130/182] add handler to send an address sms --- services/registration/address.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/address.vis b/services/registration/address.vis index dfc46d1..ba98b6b 100644 --- a/services/registration/address.vis +++ b/services/registration/address.vis @@ -1,3 +1,4 @@ +LOAD send_address_sms 16 LOAD check_identifier 0 RELOAD check_identifier MAP check_identifier From 7ea3cb6b5116105b3ef7bda1024c59d0e8be6332 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:54:23 +0300 Subject: [PATCH 131/182] remove reload for check identifier to prevent double address sms trigger --- services/registration/address.vis | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/registration/address.vis b/services/registration/address.vis index ba98b6b..a078306 100644 --- a/services/registration/address.vis +++ b/services/registration/address.vis @@ -1,6 +1,4 @@ -LOAD send_address_sms 16 LOAD check_identifier 0 -RELOAD check_identifier MAP check_identifier MOUT back 0 MOUT quit 9 From ac2a3721b21c1fed9ddbed2c3724a32399f9de5c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:55:02 +0300 Subject: [PATCH 132/182] remove dedicated address sms trigger --- handlers/local.go | 1 - 1 file changed, 1 deletion(-) diff --git a/handlers/local.go b/handlers/local.go index 870a50e..6f4963f 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,7 +124,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) - ls.DbRs.AddLocalFunc("send_address_sms", appHandlers.SendAddressSMS) ls.first = appHandlers.Init From a38ac06a3d7bcfc69d96e0c406a755d84fe9f333 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:56:41 +0300 Subject: [PATCH 133/182] trigger an address sms in the check_identifier handler --- handlers/application/menuhandler.go | 33 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 03631ad..510be83 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1222,7 +1222,8 @@ func (h *MenuHandlers) ResetAccountAuthorized(ctx context.Context, sym string, i return res, nil } -// CheckIdentifier retrieves the PublicKey from the JSON data file. +// CheckIdentifier retrieves the Public key from the userdatastore under the key: DATA_PUBLIC_KEY and triggers an sms that +// will be sent to the associated session id func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result sessionId, ok := ctx.Value("SessionId").(string) @@ -1230,9 +1231,18 @@ func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input [] return res, fmt.Errorf("missing session") } store := h.userdataStore - publicKey, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return res, err + } res.Content = string(publicKey) + //trigger an address sms to be delivered to the associated session id + err = h.sendAddressSMS(ctx) + if err != nil { + logg.DebugCtxf(ctx, "Failed to trigger an address sms", "error", err) + return res, nil + } return res, nil } @@ -2501,36 +2511,35 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } // SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. -func (h *MenuHandlers) SendAddressSMS(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result +func (h *MenuHandlers) sendAddressSMS(ctx context.Context) error { store := h.userdataStore sessionId, ok := ctx.Value("SessionId").(string) if !ok { - return res, fmt.Errorf("missing session") + return fmt.Errorf("missing session") } publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return res, err + return err } originPhone, err := phone.FormatPhoneNumber(sessionId) if err != nil { logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) - return res, nil + return nil } if !phone.IsValidPhoneNumber(originPhone) { - logg.InfoCtxf(ctx, "Invalid origin phone number", "sessionid:", sessionId) - return res, nil + logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) + return fmt.Errorf("invalid origin phone number") } err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) if err != nil { logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) - return res, nil + return fmt.Errorf("Failed to send address sms: %v", err) } - return res, nil + return nil } // sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. From 7c0651d218a047e73bfa0e49aa1b97ffdc54d92f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 12:12:33 +0300 Subject: [PATCH 134/182] use dedicated sms package for triggering sms --- internal/sms/sms.go | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 internal/sms/sms.go diff --git a/internal/sms/sms.go b/internal/sms/sms.go new file mode 100644 index 0000000..f6d51ce --- /dev/null +++ b/internal/sms/sms.go @@ -0,0 +1,96 @@ +package sms + +import ( + "context" + "fmt" + + "git.defalsify.org/vise.git/logging" + "git.grassecon.net/grassrootseconomics/common/phone" + "git.grassecon.net/grassrootseconomics/sarafu-api/remote" + "git.grassecon.net/grassrootseconomics/sarafu-vise/store" + storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" +) + +var ( + logg = logging.NewVanilla().WithDomain("smsservice") +) + +type SmsService struct { + Accountservice remote.AccountService + Userdatastore store.UserDataStore +} + +// SendUpsellSMS will send an invitation SMS to an unregistered phone number +func (smsservice *SmsService) SendUpsellSMS(ctx context.Context, inviterPhone, inviteePhone string) error { + if !phone.IsValidPhoneNumber(inviterPhone) { + return fmt.Errorf("invalid inviter phone number %v", inviterPhone) + } + + if !phone.IsValidPhoneNumber(inviteePhone) { + return fmt.Errorf("Invalid invitee phone number %v", inviteePhone) + } + _, err := smsservice.Accountservice.SendUpsellSMS(ctx, inviterPhone, inviteePhone) + if err != nil { + return fmt.Errorf("Failed to send upsell sms: %v", err) + } + return nil +} + +// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. +func (smsService *SmsService) SendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { + formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format admin phone number: %w", err) + } + + formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format blocked phone number: %w", err) + } + + if !phone.IsValidPhoneNumber(formattedAdminPhone) { + return fmt.Errorf("invalid admin phone number") + } + if !phone.IsValidPhoneNumber(formattedBlockedPhone) { + return fmt.Errorf("invalid blocked phone number") + } + + err = smsService.Accountservice.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) + if err != nil { + return fmt.Errorf("failed to send pin reset sms: %v", err) + } + + return nil +} + +// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. +func (smsService *SmsService) SendAddressSMS(ctx context.Context) error { + store := smsService.Userdatastore + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return fmt.Errorf("missing session") + } + + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return err + } + + originPhone, err := phone.FormatPhoneNumber(sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) + return nil + } + + if !phone.IsValidPhoneNumber(originPhone) { + logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) + return fmt.Errorf("invalid origin phone number") + } + err = smsService.Accountservice.SendAddressSMS(ctx, string(publicKey), originPhone) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) + return fmt.Errorf("Failed to send address sms: %v", err) + } + return nil +} From 0370a3def4e27bf47da76aa4af9141a784cef7f9 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 12:13:24 +0300 Subject: [PATCH 135/182] use dedicated smsservice for triggering extra sms --- handlers/application/menuhandler.go | 79 +++++++---------------------- 1 file changed, 17 insertions(+), 62 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 510be83..73f5283 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -29,6 +29,7 @@ import ( "git.grassecon.net/grassrootseconomics/sarafu-api/models" "git.grassecon.net/grassrootseconomics/sarafu-api/remote" "git.grassecon.net/grassrootseconomics/sarafu-vise/config" + "git.grassecon.net/grassrootseconomics/sarafu-vise/internal/sms" "git.grassecon.net/grassrootseconomics/sarafu-vise/profile" "git.grassecon.net/grassrootseconomics/sarafu-vise/store" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" @@ -77,6 +78,7 @@ type MenuHandlers struct { flagManager *FlagManager accountService remote.AccountService prefixDb storedb.PrefixDb + smsService sms.SmsService profile *profile.Profile ReplaceSeparatorFunc func(string) string } @@ -89,6 +91,10 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService userDb := &store.UserDataStore{ Db: userdataStore, } + smsservice := sms.SmsService{ + Accountservice: accountService, + Userdatastore: *userDb, + } // Instantiate the SubPrefixDb with "DATATYPE_USERDATA" prefix prefix := storedb.ToBytes(db.DATATYPE_USERDATA) @@ -98,6 +104,7 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService userdataStore: userDb, flagManager: appFlags, accountService: accountService, + smsService: smsservice, prefixDb: prefixDb, profile: &profile.Profile{Max: 6}, ReplaceSeparatorFunc: replaceSeparatorFunc, @@ -502,7 +509,10 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in // 3. Resetting the DATA_INCORRECT_PIN_ATTEMPTS to 0 for the blocked phone number func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + store := h.userdataStore + smsservice := h.smsService + sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -527,7 +537,7 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b blockedPhoneStr := string(blockedPhonenumber) //Trigger an SMS to inform a user that the blocked account has been reset if phone.IsValidPhoneNumber(blockedPhoneStr) { - err = h.sendPINResetSMS(ctx, sessionId, blockedPhoneStr) + err = smsservice.SendPINResetSMS(ctx, sessionId, blockedPhoneStr) if err != nil { logg.DebugCtxf(ctx, "Failed to send PIN reset SMS", "error", err) return res, nil @@ -1226,6 +1236,9 @@ func (h *MenuHandlers) ResetAccountAuthorized(ctx context.Context, sym string, i // will be sent to the associated session id func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + + smsservice := h.smsService + sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -1238,7 +1251,7 @@ func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input [] } res.Content = string(publicKey) //trigger an address sms to be delivered to the associated session id - err = h.sendAddressSMS(ctx) + err = smsservice.SendAddressSMS(ctx) if err != nil { logg.DebugCtxf(ctx, "Failed to trigger an address sms", "error", err) return res, nil @@ -1639,6 +1652,7 @@ func (h *MenuHandlers) TransactionReset(ctx context.Context, sym string, input [ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore + smsservice := h.smsService sessionId, ok := ctx.Value("SessionId").(string) if !ok { @@ -1660,7 +1674,7 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp return res, nil } - _, err = h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + _, err = smsservice.Accountservice.SendUpsellSMS(ctx, sessionId, string(recipient)) if err != nil { res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) return res, nil @@ -2509,62 +2523,3 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } return res, nil } - -// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. -func (h *MenuHandlers) sendAddressSMS(ctx context.Context) error { - store := h.userdataStore - - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return fmt.Errorf("missing session") - } - - publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return err - } - originPhone, err := phone.FormatPhoneNumber(sessionId) - if err != nil { - logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) - return nil - } - - if !phone.IsValidPhoneNumber(originPhone) { - logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) - return fmt.Errorf("invalid origin phone number") - } - err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) - if err != nil { - logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) - return fmt.Errorf("Failed to send address sms: %v", err) - } - return nil -} - -// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. -func (h *MenuHandlers) sendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { - formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) - if err != nil { - return fmt.Errorf("failed to format admin phone number: %w", err) - } - - formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) - if err != nil { - return fmt.Errorf("failed to format blocked phone number: %w", err) - } - - if !phone.IsValidPhoneNumber(formattedAdminPhone) { - return fmt.Errorf("invalid admin phone number") - } - if !phone.IsValidPhoneNumber(formattedBlockedPhone) { - return fmt.Errorf("invalid blocked phone number") - } - - err = h.accountService.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) - if err != nil { - return fmt.Errorf("failed to send pin reset sms: %v", err) - } - - return nil -} From 5b34ef28eb05ba5cb61d765b0103e1a4ba38b7ad Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 25 Apr 2025 09:33:08 +0300 Subject: [PATCH 136/182] added the logDb to async and http --- cmd/async/main.go | 9 +++++++++ cmd/http/main.go | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/cmd/async/main.go b/cmd/async/main.go index 9a064a6..5bb6816 100644 --- a/cmd/async/main.go +++ b/cmd/async/main.go @@ -56,6 +56,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -69,6 +70,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -120,6 +122,12 @@ func main() { fmt.Fprintf(os.Stderr, err.Error()) os.Exit(1) } + + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } //defer userdataStore.Close(ctx) dbResource, ok := rs.(*resource.DbResource) @@ -129,6 +137,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) diff --git a/cmd/http/main.go b/cmd/http/main.go index 13ef408..eed729a 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -43,6 +43,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") @@ -55,6 +56,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -103,6 +105,12 @@ func main() { os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { os.Exit(1) @@ -110,6 +118,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) From 25d124c58df132b0f6df5aa816cbe665dbe35675 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 25 Apr 2025 17:10:46 +0300 Subject: [PATCH 137/182] use updated go-vise that removes rollback on missing key --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ccc1ca5..a65c56d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 + git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 diff --git a/go.sum b/go.sum index ff01931..3b13a51 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsTAnebrB6QxRbB7zdoTHSmzzumXrJ4hw= git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= +git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk= +git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= From 1b2f3bb046dc059754e6c86464ea306e888193e6 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 2 Apr 2025 18:24:34 +0300 Subject: [PATCH 138/182] added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin --- store/db/db.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/store/db/db.go b/store/db/db.go index 220ac56..f7f7013 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -65,6 +65,8 @@ const ( DATA_ACCOUNT_ALIAS //currently suggested alias by the api awaiting user's confirmation as accepted account alias DATA_SUGGESTED_ALIAS + //currently suggested alias by the api awaiting user's confirmation as accepted account alias + DATA_SELF_PIN_RESET ) const ( From 2f4959e19111452e28fae2a66cb35a6321bf2535 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 2 Apr 2025 18:29:04 +0300 Subject: [PATCH 139/182] use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset --- handlers/application/menuhandler.go | 23 +++++++++++++++++++++-- services/registration/pp.csv | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index d6020a5..63699ba 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -297,18 +297,29 @@ func (h *MenuHandlers) ResetValidPin(ctx context.Context, sym string, input []by return res, nil } -// CheckBlockedStatus resets the account blocked flag if the PIN attempts have been reset by an admin. +// CheckBlockedStatus: +// 1. Checks whether the DATA_SELF_PIN_RESET is 1 and sets the flag_account_pin_reset +// 2. resets the account blocked flag if the PIN attempts have been reset by an admin. func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore flag_account_blocked, _ := h.flagManager.GetFlag("flag_account_blocked") + flag_account_pin_reset, _ := h.flagManager.GetFlag("flag_account_pin_reset") sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") } + selfPinReset, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET) + if err == nil { + pinResetValue, _ := strconv.ParseUint(string(selfPinReset), 0, 64) + if pinResetValue == 1 { + res.FlagSet = append(res.FlagSet, flag_account_pin_reset) + } + } + currentWrongPinAttempts, err := store.ReadEntry(ctx, sessionId, storedb.DATA_INCORRECT_PIN_ATTEMPTS) if err != nil { if !db.IsNotFound(err) { @@ -317,7 +328,6 @@ func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input } pinAttemptsValue, _ := strconv.ParseUint(string(currentWrongPinAttempts), 0, 64) - if pinAttemptsValue == 0 { res.FlagReset = append(res.FlagReset, flag_account_blocked) return res, nil @@ -659,6 +669,7 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, // ValidateBlockedNumber performs validation of phone numbers, specifically for blocked numbers in the system. // It checks phone number format and verifies registration status. +// If valid, it sets DATA_SELF_PIN_RESET as 1 on the account func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result var err error @@ -694,10 +705,18 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in return res, err } } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) if err != nil { return res, nil } + + // set the DATA_SELF_PIN_RESET for the account + err = store.WriteEntry(ctx, formattedNumber, storedb.DATA_SELF_PIN_RESET, []byte("1")) + if err != nil { + return res, nil + } + return res, nil } diff --git a/services/registration/pp.csv b/services/registration/pp.csv index e34de5d..dec5b42 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -31,3 +31,4 @@ flag,flag_back_set,37,this is set when it is a back navigation flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits) flag,flag_alias_set,40,this is set when an account alias has been assigned to a user +flag,flag_account_pin_reset,41,this is set on an account when an admin triggers a PIN reset for them From 9a2ad99d079e6266067f371b5b9c08b9373a450a Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:23:21 +0300 Subject: [PATCH 140/182] updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality --- handlers/application/menuhandler.go | 118 ++++++++++++---------------- 1 file changed, 52 insertions(+), 66 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 63699ba..b55569e 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -568,10 +568,57 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ return res, nil } +// ValidateBlockedNumber performs validation of phone numbers during the Reset other's PIN. +// It checks phone number format and verifies registration status. +// If valid, it writes the number under DATA_BLOCKED_NUMBER on the admin account +func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + var err error + + flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") + store := h.userdataStore + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + if string(input) == "0" { + res.FlagReset = append(res.FlagReset, flag_unregistered_number) + return res, nil + } + + blockedNumber := string(input) + formattedNumber, err := phone.FormatPhoneNumber(blockedNumber) + if err != nil { + res.FlagSet = append(res.FlagSet, flag_unregistered_number) + logg.ErrorCtxf(ctx, "Failed to format the phone number: %s", blockedNumber, "error", err) + return res, nil + } + + _, err = store.ReadEntry(ctx, formattedNumber, storedb.DATA_PUBLIC_KEY) + if err != nil { + if db.IsNotFound(err) { + logg.InfoCtxf(ctx, "Invalid or unregistered number") + res.FlagSet = append(res.FlagSet, flag_unregistered_number) + return res, nil + } else { + logg.ErrorCtxf(ctx, "Error on ValidateBlockedNumber", "error", err) + return res, err + } + } + + err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) + if err != nil { + return res, nil + } + + return res, nil +} + // ResetOthersPin handles the PIN reset process for other users' accounts by: // 1. Retrieving the blocked phone number from the session -// 2. Fetching the hashed temporary PIN associated with that number -// 3. Updating the account PIN with the temporary PIN +// 2. Writing the DATA_SELF_PIN_RESET on the blocked phone number +// 3. Resetting the DATA_INCORRECT_PIN_ATTEMPTS to 0 for the blocked phone number func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore @@ -584,19 +631,11 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "failed to read blockedPhonenumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) return res, err } - hashedTemporaryPin, err := store.ReadEntry(ctx, string(blockedPhonenumber), storedb.DATA_TEMPORARY_VALUE) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read hashedTmporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) - return res, err - } - if len(hashedTemporaryPin) == 0 { - logg.ErrorCtxf(ctx, "hashedTemporaryPin is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") - } - err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + // set the DATA_SELF_PIN_RESET for the account + err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_SELF_PIN_RESET, []byte("1")) if err != nil { - return res, err + return res, nil } err = store.WriteEntry(ctx, string(blockedPhonenumber), storedb.DATA_INCORRECT_PIN_ATTEMPTS, []byte(string("0"))) @@ -667,59 +706,6 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, return res, nil } -// ValidateBlockedNumber performs validation of phone numbers, specifically for blocked numbers in the system. -// It checks phone number format and verifies registration status. -// If valid, it sets DATA_SELF_PIN_RESET as 1 on the account -func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error - - flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") - store := h.userdataStore - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - - if string(input) == "0" { - res.FlagReset = append(res.FlagReset, flag_unregistered_number) - return res, nil - } - - blockedNumber := string(input) - formattedNumber, err := phone.FormatPhoneNumber(blockedNumber) - if err != nil { - res.FlagSet = append(res.FlagSet, flag_unregistered_number) - logg.ErrorCtxf(ctx, "Failed to format the phone number: %s", blockedNumber, "error", err) - return res, nil - } - - _, err = store.ReadEntry(ctx, formattedNumber, storedb.DATA_PUBLIC_KEY) - if err != nil { - if db.IsNotFound(err) { - logg.InfoCtxf(ctx, "Invalid or unregistered number") - res.FlagSet = append(res.FlagSet, flag_unregistered_number) - return res, nil - } else { - logg.ErrorCtxf(ctx, "Error on ValidateBlockedNumber", "error", err) - return res, err - } - } - - err = store.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) - if err != nil { - return res, nil - } - - // set the DATA_SELF_PIN_RESET for the account - err = store.WriteEntry(ctx, formattedNumber, storedb.DATA_SELF_PIN_RESET, []byte("1")) - if err != nil { - return res, nil - } - - return res, nil -} - // VerifyCreatePin checks whether the confirmation PIN is similar to the temporary PIN // If similar, it sets the USERFLAG_PIN_SET flag and writes the account PIN allowing the user // to access the main menu. From 919899c704e7bb0b0c552f4c851dfb0747238652 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:25:11 +0300 Subject: [PATCH 141/182] move to the authorize_reset_others_pin if the given number is valid and registered --- services/registration/enter_other_number.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/enter_other_number.vis b/services/registration/enter_other_number.vis index 018aad3..56b0558 100644 --- a/services/registration/enter_other_number.vis +++ b/services/registration/enter_other_number.vis @@ -7,4 +7,4 @@ INCMP _ 0 LOAD validate_blocked_number 6 RELOAD validate_blocked_number CATCH unregistered_number flag_unregistered_number 1 -INCMP enter_others_new_pin * +INCMP authorize_reset_others_pin * From 70815aabd172ae510bfeed16fb5aa382645876b9 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:25:50 +0300 Subject: [PATCH 142/182] request the admin to authorize the PIN reset --- services/registration/authorize_reset_others_pin | 2 ++ services/registration/authorize_reset_others_pin.vis | 12 ++++++++++++ services/registration/authorize_reset_others_pin_swa | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 services/registration/authorize_reset_others_pin create mode 100644 services/registration/authorize_reset_others_pin.vis create mode 100644 services/registration/authorize_reset_others_pin_swa diff --git a/services/registration/authorize_reset_others_pin b/services/registration/authorize_reset_others_pin new file mode 100644 index 0000000..1ed5a77 --- /dev/null +++ b/services/registration/authorize_reset_others_pin @@ -0,0 +1,2 @@ +{{.retrieve_blocked_number}} will get a PIN reset request. +Please enter your PIN to confirm: \ No newline at end of file diff --git a/services/registration/authorize_reset_others_pin.vis b/services/registration/authorize_reset_others_pin.vis new file mode 100644 index 0000000..6f9e5b3 --- /dev/null +++ b/services/registration/authorize_reset_others_pin.vis @@ -0,0 +1,12 @@ +LOAD retrieve_blocked_number 0 +RELOAD retrieve_blocked_number +MAP retrieve_blocked_number +MOUT back 0 +MOUT quit 9 +LOAD authorize_account 6 +HALT +RELOAD authorize_account +CATCH incorrect_pin flag_incorrect_pin 1 +INCMP _ 0 +INCMP quit 9 +INCMP pin_reset_result * diff --git a/services/registration/authorize_reset_others_pin_swa b/services/registration/authorize_reset_others_pin_swa new file mode 100644 index 0000000..4f355ac --- /dev/null +++ b/services/registration/authorize_reset_others_pin_swa @@ -0,0 +1,2 @@ +{{.retrieve_blocked_number}} atapokea ombi la kuweka upya PIN. +Tafadhali weka PIN yako kudhibitisha: \ No newline at end of file From 6385735b89606e61996f88174dbc9a347c342a5d Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Tue, 8 Apr 2025 16:26:21 +0300 Subject: [PATCH 143/182] move back to the previous node if the admin user is not authorized --- services/registration/pin_reset_result.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/pin_reset_result.vis b/services/registration/pin_reset_result.vis index de877e5..a676198 100644 --- a/services/registration/pin_reset_result.vis +++ b/services/registration/pin_reset_result.vis @@ -1,3 +1,4 @@ +CATCH _ flag_account_authorized 0 LOAD retrieve_blocked_number 0 MAP retrieve_blocked_number LOAD reset_others_pin 6 From e6e8bb66718bfcf3911a7e8fc11be84b221390fb Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:10:12 +0300 Subject: [PATCH 144/182] set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset --- handlers/application/menuhandler.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index b55569e..f2eadd6 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -312,6 +312,8 @@ func (h *MenuHandlers) CheckBlockedStatus(ctx context.Context, sym string, input return res, fmt.Errorf("missing session") } + res.FlagReset = append(res.FlagReset, flag_account_pin_reset) + selfPinReset, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET) if err == nil { pinResetValue, _ := strconv.ParseUint(string(selfPinReset), 0, 64) @@ -529,6 +531,7 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ return res, fmt.Errorf("missing session") } flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") + flag_account_pin_reset, _ := h.flagManager.GetFlag("flag_account_pin_reset") if string(input) == "0" { res.FlagReset = append(res.FlagReset, flag_pin_mismatch) @@ -560,10 +563,13 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "hashedPIN value", hashedTemporaryPin, "error", err) return res, err } - err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + // set the DATA_SELF_PIN_RESET as 0 + err = store.WriteEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET, []byte("0")) if err != nil { - logg.DebugCtxf(ctx, "Failed to write hashed PIN db log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin) + logg.ErrorCtxf(ctx, "failed to write DATA_SELF_PIN_RESET entry with", "key", storedb.DATA_SELF_PIN_RESET, "self PIN reset value", "0", "error", err) + return res, err } + res.FlagReset = append(res.FlagReset, flag_account_pin_reset) return res, nil } From 7c4d37b5b8dbef99e6a386096e7ec3b21258f69a Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:11:51 +0300 Subject: [PATCH 145/182] use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset --- services/registration/root.vis | 1 + services/registration/self_reset_pin | 2 ++ services/registration/self_reset_pin.vis | 8 ++++++++ services/registration/self_reset_pin_swa | 2 ++ 4 files changed, 13 insertions(+) create mode 100644 services/registration/self_reset_pin create mode 100644 services/registration/self_reset_pin.vis create mode 100644 services/registration/self_reset_pin_swa diff --git a/services/registration/root.vis b/services/registration/root.vis index c57f31c..923caef 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -2,6 +2,7 @@ LOAD check_blocked_status 1 RELOAD check_blocked_status LOAD check_account_created 2 RELOAD check_account_created +CATCH self_reset_pin flag_account_pin_reset 1 CATCH blocked_account flag_account_blocked 1 CATCH select_language flag_language_set 0 CATCH terms flag_account_created 0 diff --git a/services/registration/self_reset_pin b/services/registration/self_reset_pin new file mode 100644 index 0000000..ce40705 --- /dev/null +++ b/services/registration/self_reset_pin @@ -0,0 +1,2 @@ +A PIN reset has been done on your account. +Please enter a new four number PIN: \ No newline at end of file diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis new file mode 100644 index 0000000..3439fcd --- /dev/null +++ b/services/registration/self_reset_pin.vis @@ -0,0 +1,8 @@ +LOAD reset_invalid_pin 6 +HALT +LOAD save_temporary_pin 1 +RELOAD save_temporary_pin +LOAD verify_new_pin 2 +RELOAD verify_new_pin +CATCH invalid_pin flag_valid_pin 0 +INCMP confirm_self_pin_reset * diff --git a/services/registration/self_reset_pin_swa b/services/registration/self_reset_pin_swa new file mode 100644 index 0000000..0ef19d0 --- /dev/null +++ b/services/registration/self_reset_pin_swa @@ -0,0 +1,2 @@ +Uwekaji upya wa PIN umefanyika kwenye akaunti yako. +Tafadhali weka PIN mpya ya nambari nne: \ No newline at end of file From 228d936a0e46449b355dfc90b8058eb061642895 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:12:51 +0300 Subject: [PATCH 146/182] use the confirm_self_pin_reset to confirm the new PIN --- services/registration/confirm_self_pin_reset | 1 + services/registration/confirm_self_pin_reset.vis | 7 +++++++ services/registration/confirm_self_pin_reset_swa | 1 + 3 files changed, 9 insertions(+) create mode 100644 services/registration/confirm_self_pin_reset create mode 100644 services/registration/confirm_self_pin_reset.vis create mode 100644 services/registration/confirm_self_pin_reset_swa diff --git a/services/registration/confirm_self_pin_reset b/services/registration/confirm_self_pin_reset new file mode 100644 index 0000000..2e1b83e --- /dev/null +++ b/services/registration/confirm_self_pin_reset @@ -0,0 +1 @@ +Confirm your new PIN: \ No newline at end of file diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis new file mode 100644 index 0000000..043ad38 --- /dev/null +++ b/services/registration/confirm_self_pin_reset.vis @@ -0,0 +1,7 @@ +MOUT back 0 +HALT +INCMP _ 0 +LOAD confirm_pin_change 0 +RELOAD confirm_pin_change +CATCH pin_reset_mismatch flag_pin_mismatch 1 +INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset_swa b/services/registration/confirm_self_pin_reset_swa new file mode 100644 index 0000000..e407fec --- /dev/null +++ b/services/registration/confirm_self_pin_reset_swa @@ -0,0 +1 @@ +Thibitisha PIN yako mpya: \ No newline at end of file From 982eebf374e020dbaea151e6720cd4056ffeba40 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 15:19:23 +0300 Subject: [PATCH 147/182] move to the top node when one selects back --- services/registration/my_account.vis | 2 +- services/registration/pin_reset_success.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/my_account.vis b/services/registration/my_account.vis index c0b624e..fc0a634 100644 --- a/services/registration/my_account.vis +++ b/services/registration/my_account.vis @@ -9,7 +9,7 @@ MOUT my_address 6 MOUT my_account_alias 7 MOUT back 0 HALT -INCMP main 0 +INCMP ^ 0 INCMP edit_profile 1 INCMP change_language 2 INCMP balances 3 diff --git a/services/registration/pin_reset_success.vis b/services/registration/pin_reset_success.vis index a3a143f..5535616 100644 --- a/services/registration/pin_reset_success.vis +++ b/services/registration/pin_reset_success.vis @@ -1,6 +1,6 @@ MOUT back 0 MOUT quit 9 HALT -INCMP main 0 +INCMP ^ 0 INCMP quit 9 INCMP . * From ef8e3d5c3573ce31d76f763daad4abdec5614edf Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:49:04 +0300 Subject: [PATCH 148/182] allow the user to quit and move to invalid_pin node if the given input is invalid --- services/registration/create_pin.vis | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/create_pin.vis b/services/registration/create_pin.vis index 40989ec..b329fc3 100644 --- a/services/registration/create_pin.vis +++ b/services/registration/create_pin.vis @@ -2,8 +2,8 @@ LOAD create_account 0 CATCH account_creation_failed flag_account_creation_failed 1 MOUT exit 0 HALT +INCMP quit 0 LOAD save_temporary_pin 6 RELOAD save_temporary_pin -CATCH . flag_incorrect_pin 1 -INCMP quit 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_create_pin * From 850458b5d85630e2af649ee68e300705e461fece Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:55:46 +0300 Subject: [PATCH 149/182] use a single pin_mismatch node for a confirmed PIN that does not match the original PIN --- services/registration/confirm_create_pin.vis | 5 ++++- services/registration/confirm_pin_change.vis | 2 +- services/registration/confirm_self_pin_reset.vis | 2 +- services/registration/create_pin_mismatch.vis | 5 ----- services/registration/{create_pin_mismatch => pin_mismatch} | 0 .../{pin_reset_mismatch.vis => pin_mismatch.vis} | 0 .../{create_pin_mismatch_swa => pin_mismatch_swa} | 0 services/registration/pin_reset_mismatch | 1 - services/registration/pin_reset_mismatch_swa | 1 - 9 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 services/registration/create_pin_mismatch.vis rename services/registration/{create_pin_mismatch => pin_mismatch} (100%) rename services/registration/{pin_reset_mismatch.vis => pin_mismatch.vis} (100%) rename services/registration/{create_pin_mismatch_swa => pin_mismatch_swa} (100%) delete mode 100644 services/registration/pin_reset_mismatch delete mode 100644 services/registration/pin_reset_mismatch_swa diff --git a/services/registration/confirm_create_pin.vis b/services/registration/confirm_create_pin.vis index 02279dc..2e82d7d 100644 --- a/services/registration/confirm_create_pin.vis +++ b/services/registration/confirm_create_pin.vis @@ -1,4 +1,7 @@ -LOAD save_temporary_pin 6 +MOUT back 0 HALT +INCMP _ 0 LOAD verify_create_pin 8 +RELOAD verify_create_pin +CATCH pin_mismatch flag_pin_mismatch 1 INCMP account_creation * diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 09b12f8..6e50c11 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -3,5 +3,5 @@ MOUT back 0 HALT INCMP _ 0 RELOAD confirm_pin_change -CATCH pin_reset_mismatch flag_pin_mismatch 1 +CATCH pin_mismatch flag_pin_mismatch 1 INCMP * pin_reset_success diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis index 043ad38..419662b 100644 --- a/services/registration/confirm_self_pin_reset.vis +++ b/services/registration/confirm_self_pin_reset.vis @@ -3,5 +3,5 @@ HALT INCMP _ 0 LOAD confirm_pin_change 0 RELOAD confirm_pin_change -CATCH pin_reset_mismatch flag_pin_mismatch 1 +CATCH pin_mismatch flag_pin_mismatch 1 INCMP pin_reset_success * diff --git a/services/registration/create_pin_mismatch.vis b/services/registration/create_pin_mismatch.vis deleted file mode 100644 index 91793b5..0000000 --- a/services/registration/create_pin_mismatch.vis +++ /dev/null @@ -1,5 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP confirm_create_pin 1 -INCMP quit 9 diff --git a/services/registration/create_pin_mismatch b/services/registration/pin_mismatch similarity index 100% rename from services/registration/create_pin_mismatch rename to services/registration/pin_mismatch diff --git a/services/registration/pin_reset_mismatch.vis b/services/registration/pin_mismatch.vis similarity index 100% rename from services/registration/pin_reset_mismatch.vis rename to services/registration/pin_mismatch.vis diff --git a/services/registration/create_pin_mismatch_swa b/services/registration/pin_mismatch_swa similarity index 100% rename from services/registration/create_pin_mismatch_swa rename to services/registration/pin_mismatch_swa diff --git a/services/registration/pin_reset_mismatch b/services/registration/pin_reset_mismatch deleted file mode 100644 index dc0236b..0000000 --- a/services/registration/pin_reset_mismatch +++ /dev/null @@ -1 +0,0 @@ -The PIN is not a match. Try again diff --git a/services/registration/pin_reset_mismatch_swa b/services/registration/pin_reset_mismatch_swa deleted file mode 100644 index 5787790..0000000 --- a/services/registration/pin_reset_mismatch_swa +++ /dev/null @@ -1 +0,0 @@ -PIN uliyoweka hailingani.Jaribu tena. \ No newline at end of file From 7d800d68a029adb5618ffff129d79938777db640 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:57:22 +0300 Subject: [PATCH 150/182] have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked --- services/registration/root.vis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/root.vis b/services/registration/root.vis index 923caef..ec5b54e 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -6,10 +6,10 @@ CATCH self_reset_pin flag_account_pin_reset 1 CATCH blocked_account flag_account_blocked 1 CATCH select_language flag_language_set 0 CATCH terms flag_account_created 0 +CATCH create_pin flag_pin_set 0 LOAD check_account_status 0 RELOAD check_account_status CATCH api_failure flag_api_call_error 1 CATCH account_pending flag_account_pending 1 -CATCH create_pin flag_pin_set 0 CATCH main flag_account_success 1 HALT From 7a542d1f1cfdef9ae6833d1223fbbd24e647bb03 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:58:13 +0300 Subject: [PATCH 151/182] updated the description of the flag_incorrect_pin --- services/registration/pp.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/pp.csv b/services/registration/pp.csv index dec5b42..ff26614 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -9,7 +9,7 @@ flag,flag_account_authorized,15,this is set to allow a user access guarded nodes flag,flag_invalid_recipient,16,this is set when the transaction recipient is invalid flag,flag_invalid_recipient_with_invite,17,this is set when the transaction recipient is valid but not on the platform flag,flag_invalid_amount,18,this is set when the given transaction amount is invalid -flag,flag_incorrect_pin,19,this is set when the provided PIN is invalid or does not match the current account's PIN +flag,flag_incorrect_pin,19,this is set when the provided PIN does not match the current account's PIN flag,flag_valid_pin,20,this is set when the given PIN is valid flag,flag_allow_update,21,this is set to allow a user to update their profile data flag,flag_single_edit,22,this is set to allow a user to edit a single profile item such as year of birth From f90a188accb95ae56f3c1aa046518375875c3699 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 16:59:48 +0300 Subject: [PATCH 152/182] updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin --- handlers/application/menuhandler.go | 38 +++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index f2eadd6..6eb2258 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -407,15 +407,20 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ return res, fmt.Errorf("missing session") } - flag_incorrect_pin, _ := h.flagManager.GetFlag("flag_incorrect_pin") - accountPIN := string(input) + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") - // Validate that the PIN is a 4-digit number. - if !pin.IsValidPIN(accountPIN) { - res.FlagSet = append(res.FlagSet, flag_incorrect_pin) + if string(input) == "0" { return res, nil } - res.FlagReset = append(res.FlagReset, flag_incorrect_pin) + + accountPIN := string(input) + + // Validate that the PIN has a valid format. + if !pin.IsValidPIN(accountPIN) { + res.FlagSet = append(res.FlagSet, flag_invalid_pin) + return res, nil + } + res.FlagReset = append(res.FlagReset, flag_invalid_pin) // Hash the PIN hashedPIN, err := pin.HashPIN(string(accountPIN)) @@ -718,14 +723,20 @@ func (h *MenuHandlers) ResetUnregisteredNumber(ctx context.Context, sym string, func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") - flag_pin_set, _ := h.flagManager.GetFlag("flag_pin_set") - sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") } + + flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") + flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") + flag_pin_set, _ := h.flagManager.GetFlag("flag_pin_set") + + if string(input) == "0" { + res.FlagReset = append(res.FlagReset, flag_pin_mismatch) + return res, nil + } + store := h.userdataStore hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { @@ -738,14 +749,15 @@ func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input [] } if pin.VerifyPIN(string(hashedTemporaryPin), string(input)) { - res.FlagSet = []uint32{flag_valid_pin} - res.FlagReset = []uint32{flag_pin_mismatch} + res.FlagSet = append(res.FlagSet, flag_valid_pin) res.FlagSet = append(res.FlagSet, flag_pin_set) + res.FlagReset = append(res.FlagReset, flag_pin_mismatch) } else { - res.FlagSet = []uint32{flag_pin_mismatch} + res.FlagSet = append(res.FlagSet, flag_pin_mismatch) return res, nil } + // save the hashed PIN as the new account PIN err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) if err != nil { logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) From af7e6cc603be984251e4482ff4bf22ad613b0047 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:34:24 +0300 Subject: [PATCH 153/182] add a space --- services/registration/invalid_pin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/registration/invalid_pin b/services/registration/invalid_pin index 607c151..a5031af 100644 --- a/services/registration/invalid_pin +++ b/services/registration/invalid_pin @@ -1 +1 @@ -The PIN you entered is invalid.The PIN must be a 4 digit number. \ No newline at end of file +The PIN you entered is invalid. The PIN must be a 4 digit number. \ No newline at end of file From ad395c4b1a994cd68921d5baf91f979f38b77e81 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:39:41 +0300 Subject: [PATCH 154/182] remove code related to admins resetting a user's actual PIN --- handlers/application/menuhandler.go | 81 --------- handlers/application/menuhandler_test.go | 167 ------------------ handlers/local.go | 2 - services/registration/confirm_others_new_pin | 1 - .../registration/confirm_others_new_pin.vis | 14 -- .../registration/confirm_others_new_pin_swa | 1 - services/registration/enter_others_new_pin | 1 - .../registration/enter_others_new_pin.vis | 9 - .../registration/enter_others_new_pin_swa | 1 - services/registration/invalid_others_pin | 1 - services/registration/invalid_others_pin.vis | 5 - services/registration/others_pin_mismatch | 1 - services/registration/others_pin_mismatch.vis | 6 - services/registration/others_pin_mismatch_swa | 1 - 14 files changed, 291 deletions(-) delete mode 100644 services/registration/confirm_others_new_pin delete mode 100644 services/registration/confirm_others_new_pin.vis delete mode 100644 services/registration/confirm_others_new_pin_swa delete mode 100644 services/registration/enter_others_new_pin delete mode 100644 services/registration/enter_others_new_pin.vis delete mode 100644 services/registration/enter_others_new_pin_swa delete mode 100644 services/registration/invalid_others_pin delete mode 100644 services/registration/invalid_others_pin.vis delete mode 100644 services/registration/others_pin_mismatch delete mode 100644 services/registration/others_pin_mismatch.vis delete mode 100644 services/registration/others_pin_mismatch_swa diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 6eb2258..8cea421 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -439,87 +439,6 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ return res, nil } -// SaveOthersTemporaryPin allows authorized users to set temporary PINs for blocked numbers. -func (h *MenuHandlers) SaveOthersTemporaryPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error - - store := h.userdataStore - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - - temporaryPin := string(input) - - // Validate that the input is a 4-digit number. - if !pin.IsValidPIN(temporaryPin) { - return res, nil - } - - // Retrieve the blocked number associated with this session - blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) - return res, err - } - - // Hash the temporary PIN - hashedPIN, err := pin.HashPIN(string(temporaryPin)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to hash temporaryPin", "error", err) - return res, err - } - - // Save the hashed temporary PIN for that blocked number - err = store.WriteEntry(ctx, string(blockedNumber), storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) - if err != nil { - logg.ErrorCtxf(ctx, "failed to write hashed temporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", temporaryPin, "error", err) - return res, err - } - - return res, nil -} - -// CheckBlockedNumPinMisMatch checks if the provided PIN matches a temporary PIN stored for a blocked number. -func (h *MenuHandlers) CheckBlockedNumPinMisMatch(ctx context.Context, sym string, input []byte) (resource.Result, error) { - res := resource.Result{} - flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - if string(input) == "0" { - res.FlagReset = append(res.FlagReset, flag_pin_mismatch) - return res, nil - } - - // Get blocked number from storage. - store := h.userdataStore - blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read blockedNumber entry with", "key", storedb.DATA_BLOCKED_NUMBER, "error", err) - return res, err - } - // Get Hashed temporary PIN for the blocked number. - hashedTemporaryPin, err := store.ReadEntry(ctx, string(blockedNumber), storedb.DATA_TEMPORARY_VALUE) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) - return res, err - } - if len(hashedTemporaryPin) == 0 { - logg.ErrorCtxf(ctx, "hashedTemporaryPin is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") - } - - if pin.VerifyPIN(string(hashedTemporaryPin), string(input)) { - res.FlagReset = append(res.FlagReset, flag_pin_mismatch) - } else { - res.FlagSet = append(res.FlagSet, flag_pin_mismatch) - } - return res, nil -} - // ResetInvalidPIN resets the invalid PIN flag func (h *MenuHandlers) ResetInvalidPIN(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 1a3789b..cbe6843 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2889,173 +2889,6 @@ func TestValidateBlockedNumber(t *testing.T) { } } -func TestSaveOthersTemporaryPin(t *testing.T) { - sessionId := "session123" - blockedNumber := "+254712345678" - testPin := "1234" - - ctx, userStore := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - h := &MenuHandlers{ - userdataStore: userStore, - } - - tests := []struct { - name string - sessionId string - blockedNumber string - testPin string - setup func() error // Setup function for each test case - expectedError bool - verifyResult func(t *testing.T) // Function to verify the result - }{ - { - name: "Missing Session ID", - sessionId: "", // Empty session ID - blockedNumber: blockedNumber, - testPin: testPin, - setup: nil, - expectedError: true, - verifyResult: nil, - }, - { - name: "Failed to Read Blocked Number", - sessionId: sessionId, - blockedNumber: blockedNumber, - testPin: testPin, - setup: func() error { - // Do not write the blocked number to simulate a read failure - return nil - }, - expectedError: true, - verifyResult: nil, - }, - - { - name: "Successfully save hashed PIN", - sessionId: sessionId, - blockedNumber: blockedNumber, - testPin: testPin, - setup: func() error { - // Write the blocked number to the store - return userStore.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(blockedNumber)) - }, - expectedError: false, - verifyResult: func(t *testing.T) { - // Read the stored hashed PIN - othersHashedPin, err := userStore.ReadEntry(ctx, blockedNumber, storedb.DATA_TEMPORARY_VALUE) - if err != nil { - t.Fatal(err) - } - - // Verify that the stored hashed PIN matches the original PIN - if !pin.VerifyPIN(string(othersHashedPin), testPin) { - t.Fatal("stored hashed PIN does not match the original PIN") - } - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // Set up the context with the session ID - ctx := context.WithValue(context.Background(), "SessionId", tt.sessionId) - - // Run the setup function if provided - if tt.setup != nil { - err := tt.setup() - if err != nil { - t.Fatal(err) - } - } - - // Call the function under test - _, err := h.SaveOthersTemporaryPin(ctx, "save_others_temporary_pin", []byte(tt.testPin)) - - // Assert the error - if tt.expectedError { - assert.Error(t, err) - } else { - assert.NoError(t, err) - } - - // Verify the result if a verification function is provided - if tt.verifyResult != nil { - tt.verifyResult(t) - } - }) - } -} - -func TestCheckBlockedNumPinMisMatch(t *testing.T) { - sessionId := "session123" - blockedNumber := "+254712345678" - testPin := "1234" - mockState := state.NewState(128) - - ctx, userStore := InitializeTestStore(t) - ctx = context.WithValue(ctx, "SessionId", sessionId) - - hashedPIN, err := pin.HashPIN(testPin) - if err != nil { - logg.ErrorCtxf(ctx, "failed to hash testPin", "error", err) - t.Fatal(err) - } - - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Fatal(err) - } - flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch") - - h := &MenuHandlers{ - userdataStore: userStore, - st: mockState, - flagManager: fm, - } - - // Write initial data to the store - err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(blockedNumber)) - if err != nil { - t.Fatal(err) - } - err = userStore.WriteEntry(ctx, blockedNumber, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) - if err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - input []byte - expectedResult resource.Result - }{ - { - name: "Successful PIN match", - input: []byte(testPin), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_pin_mismatch}, - }, - }, - { - name: "PIN mismatch", - input: []byte("1345"), - expectedResult: resource.Result{ - FlagSet: []uint32{flag_pin_mismatch}, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - res, err := h.CheckBlockedNumPinMisMatch(ctx, "sym", tt.input) - - assert.NoError(t, err) - assert.Equal(t, tt.expectedResult, res) - }) - } -} - func TestGetCurrentProfileInfo(t *testing.T) { sessionId := "session123" ctx, store := InitializeTestStore(t) diff --git a/handlers/local.go b/handlers/local.go index 64bc38f..905f673 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -114,12 +114,10 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher) ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails) ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin) - ls.DbRs.AddLocalFunc("check_pin_mismatch", appHandlers.CheckBlockedNumPinMisMatch) ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber) ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber) ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber) ls.DbRs.AddLocalFunc("reset_others_pin", appHandlers.ResetOthersPin) - ls.DbRs.AddLocalFunc("save_others_temporary_pin", appHandlers.SaveOthersTemporaryPin) ls.DbRs.AddLocalFunc("get_current_profile_info", appHandlers.GetCurrentProfileInfo) ls.DbRs.AddLocalFunc("check_transactions", appHandlers.CheckTransactions) ls.DbRs.AddLocalFunc("get_transactions", appHandlers.GetTransactionsList) diff --git a/services/registration/confirm_others_new_pin b/services/registration/confirm_others_new_pin deleted file mode 100644 index 720778b..0000000 --- a/services/registration/confirm_others_new_pin +++ /dev/null @@ -1 +0,0 @@ -Please confirm new PIN for: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/confirm_others_new_pin.vis b/services/registration/confirm_others_new_pin.vis deleted file mode 100644 index 50dfb19..0000000 --- a/services/registration/confirm_others_new_pin.vis +++ /dev/null @@ -1,14 +0,0 @@ -CATCH incorrect_pin flag_incorrect_pin 1 -RELOAD retrieve_blocked_number -MAP retrieve_blocked_number -CATCH invalid_others_pin flag_valid_pin 0 -CATCH pin_reset_result flag_account_authorized 1 -LOAD save_others_temporary_pin 6 -RELOAD save_others_temporary_pin -MOUT back 0 -HALT -INCMP _ 0 -LOAD check_pin_mismatch 6 -RELOAD check_pin_mismatch -CATCH others_pin_mismatch flag_pin_mismatch 1 -INCMP pin_entry * diff --git a/services/registration/confirm_others_new_pin_swa b/services/registration/confirm_others_new_pin_swa deleted file mode 100644 index f0b09c8..0000000 --- a/services/registration/confirm_others_new_pin_swa +++ /dev/null @@ -1 +0,0 @@ -Tafadhali thibitisha PIN mpya ya: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/enter_others_new_pin b/services/registration/enter_others_new_pin deleted file mode 100644 index 52ae664..0000000 --- a/services/registration/enter_others_new_pin +++ /dev/null @@ -1 +0,0 @@ -Please enter new PIN for: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/enter_others_new_pin.vis b/services/registration/enter_others_new_pin.vis deleted file mode 100644 index 3f8a5c6..0000000 --- a/services/registration/enter_others_new_pin.vis +++ /dev/null @@ -1,9 +0,0 @@ -LOAD retrieve_blocked_number 0 -RELOAD retrieve_blocked_number -MAP retrieve_blocked_number -MOUT back 0 -HALT -LOAD verify_new_pin 6 -RELOAD verify_new_pin -INCMP _ 0 -INCMP * confirm_others_new_pin diff --git a/services/registration/enter_others_new_pin_swa b/services/registration/enter_others_new_pin_swa deleted file mode 100644 index 77ec2f3..0000000 --- a/services/registration/enter_others_new_pin_swa +++ /dev/null @@ -1 +0,0 @@ -Tafadhali weka PIN mpya ya: {{.retrieve_blocked_number}} \ No newline at end of file diff --git a/services/registration/invalid_others_pin b/services/registration/invalid_others_pin deleted file mode 100644 index acdf45f..0000000 --- a/services/registration/invalid_others_pin +++ /dev/null @@ -1 +0,0 @@ -The PIN you have entered is invalid.Please try a 4 digit number instead. \ No newline at end of file diff --git a/services/registration/invalid_others_pin.vis b/services/registration/invalid_others_pin.vis deleted file mode 100644 index d218e6d..0000000 --- a/services/registration/invalid_others_pin.vis +++ /dev/null @@ -1,5 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP enter_others_new_pin 1 -INCMP quit 9 diff --git a/services/registration/others_pin_mismatch b/services/registration/others_pin_mismatch deleted file mode 100644 index deb9fe5..0000000 --- a/services/registration/others_pin_mismatch +++ /dev/null @@ -1 +0,0 @@ -The PIN you have entered is not a match diff --git a/services/registration/others_pin_mismatch.vis b/services/registration/others_pin_mismatch.vis deleted file mode 100644 index b2421aa..0000000 --- a/services/registration/others_pin_mismatch.vis +++ /dev/null @@ -1,6 +0,0 @@ -MOUT retry 1 -MOUT quit 9 -HALT -INCMP _ 1 -INCMP quit 9 -INCMP . * diff --git a/services/registration/others_pin_mismatch_swa b/services/registration/others_pin_mismatch_swa deleted file mode 100644 index 5787790..0000000 --- a/services/registration/others_pin_mismatch_swa +++ /dev/null @@ -1 +0,0 @@ -PIN uliyoweka hailingani.Jaribu tena. \ No newline at end of file From c206fa1329331f4eb089fae0c9daac25afc38d8d Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:52:18 +0300 Subject: [PATCH 155/182] updated the menu flow for the admin reset others PIN in test --- menutraversal_test/group_test.json | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index b3177a9..c5dc3a2 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -202,23 +202,7 @@ }, { "input": "0700000000", - "expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "11111", - "expectedContent": "The PIN you have entered is invalid.Please try a 4 digit number instead.\n1:Retry\n9:Quit" - }, - { - "input": "1", - "expectedContent": "Please enter new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "1111", - "expectedContent": "Please confirm new PIN for: {secondary_session_id}\n0:Back" - }, - { - "input": "1111", - "expectedContent": "Please enter your PIN:" + "expectedContent": "{secondary_session_id} will get a PIN reset request.\nPlease enter your PIN to confirm:\n0:Back\n9:Quit" }, { "input": "1234", From 8b2b6673074c9bc2a317647ce28a46b761c408a6 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:52:58 +0300 Subject: [PATCH 156/182] updated the expected content for the alias in view profile --- menutraversal_test/group_test.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index c5dc3a2..38c382e 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -596,7 +596,7 @@ }, { "input": "1234", - "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit" + "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit" }, { "input": "0", From 3426d31a9eddc8ef51a3d15086083de064318499 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 17:57:54 +0300 Subject: [PATCH 157/182] use the correct flag_invalid_pin in TestSaveTemporaryPin --- handlers/application/menuhandler_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index cbe6843..95959c9 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -566,7 +566,7 @@ func TestSaveTemporaryPin(t *testing.T) { log.Fatal(err) } - flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin") + flag_invalid_pin, _ := fm.GetFlag("flag_invalid_pin") // Create the MenuHandlers instance with the mock flag manager h := &MenuHandlers{ @@ -584,14 +584,14 @@ func TestSaveTemporaryPin(t *testing.T) { name: "Valid Pin entry", input: []byte("1234"), expectedResult: resource.Result{ - FlagReset: []uint32{flag_incorrect_pin}, + FlagReset: []uint32{flag_invalid_pin}, }, }, { name: "Invalid Pin entry", input: []byte("12343"), expectedResult: resource.Result{ - FlagSet: []uint32{flag_incorrect_pin}, + FlagSet: []uint32{flag_invalid_pin}, }, }, } From 965f343230aa18e18f942ef875aa7288656cb4a8 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:01:40 +0300 Subject: [PATCH 158/182] update the reset flags in TestConfirmPinChange --- handlers/application/menuhandler_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 95959c9..f6c97d0 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1889,7 +1889,7 @@ func TestVerifyNewPin(t *testing.T) { } } -func TestConfirmPin(t *testing.T) { +func TestConfirmPinChange(t *testing.T) { sessionId := "session123" mockState := state.NewState(16) @@ -1898,6 +1898,8 @@ func TestConfirmPin(t *testing.T) { fm, _ := NewFlagManager(flagsPath) flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch") + flag_account_pin_reset, _ := fm.GetFlag("flag_account_pin_reset") + mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ userdataStore: store, @@ -1917,7 +1919,7 @@ func TestConfirmPin(t *testing.T) { input: []byte("1234"), temporarypin: "1234", expectedResult: resource.Result{ - FlagReset: []uint32{flag_pin_mismatch}, + FlagReset: []uint32{flag_pin_mismatch, flag_account_pin_reset}, }, }, } From e8ff468c7ba97a46680e6fc0818e399b95f72b77 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:06:24 +0300 Subject: [PATCH 159/182] update the reset flags in TestCheckBlockedStatus --- handlers/application/menuhandler_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index f6c97d0..71a9256 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -2338,10 +2338,8 @@ func TestCheckBlockedStatus(t *testing.T) { if err != nil { t.Logf(err.Error()) } - flag_account_blocked, err := fm.GetFlag("flag_account_blocked") - if err != nil { - t.Logf(err.Error()) - } + flag_account_blocked, _ := fm.GetFlag("flag_account_blocked") + flag_account_pin_reset, _ := fm.GetFlag("flag_account_pin_reset") h := &MenuHandlers{ userdataStore: store, @@ -2356,13 +2354,15 @@ func TestCheckBlockedStatus(t *testing.T) { { name: "Currently blocked account", currentWrongPinAttempts: "4", - expectedResult: resource.Result{}, + expectedResult: resource.Result{ + FlagReset: []uint32{flag_account_pin_reset}, + }, }, { name: "Account with 0 wrong PIN attempts", currentWrongPinAttempts: "0", expectedResult: resource.Result{ - FlagReset: []uint32{flag_account_blocked}, + FlagReset: []uint32{flag_account_pin_reset, flag_account_blocked}, }, }, } From d4fefe3c39bf403b88b3159a3172f02f92bb9f54 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:10:51 +0300 Subject: [PATCH 160/182] update the order for the INCMP statement --- services/registration/confirm_pin_change.vis | 2 +- services/registration/new_pin.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 6e50c11..2077d23 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -4,4 +4,4 @@ HALT INCMP _ 0 RELOAD confirm_pin_change CATCH pin_mismatch flag_pin_mismatch 1 -INCMP * pin_reset_success +INCMP pin_reset_success * \ No newline at end of file diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 56705d7..59e71e4 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -4,4 +4,4 @@ INCMP _ 0 RELOAD save_temporary_pin RELOAD verify_new_pin CATCH invalid_pin flag_valid_pin 0 -INCMP * confirm_pin_change +INCMP confirm_pin_change * From 491e97d8af824b2d0847acd639fa5b3476e6722c Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:14:10 +0300 Subject: [PATCH 161/182] cleanup: remove extra space --- services/registration/amount.vis | 2 +- services/registration/community_balance.vis | 2 +- services/registration/confirm_new_alias.vis | 2 +- services/registration/my_balance.vis | 2 +- services/registration/root.vis | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/registration/amount.vis b/services/registration/amount.vis index 10d4430..c50691f 100644 --- a/services/registration/amount.vis +++ b/services/registration/amount.vis @@ -6,7 +6,7 @@ MOUT back 0 HALT LOAD validate_amount 64 RELOAD validate_amount -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 CATCH invalid_amount flag_invalid_amount 1 INCMP _ 0 LOAD get_recipient 0 diff --git a/services/registration/community_balance.vis b/services/registration/community_balance.vis index fad90cc..a748685 100644 --- a/services/registration/community_balance.vis +++ b/services/registration/community_balance.vis @@ -1,6 +1,6 @@ LOAD reset_incorrect 6 LOAD fetch_community_balance 0 -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 MAP fetch_community_balance CATCH incorrect_pin flag_incorrect_pin 1 CATCH pin_entry flag_account_authorized 0 diff --git a/services/registration/confirm_new_alias.vis b/services/registration/confirm_new_alias.vis index ad56fe0..ea79412 100644 --- a/services/registration/confirm_new_alias.vis +++ b/services/registration/confirm_new_alias.vis @@ -8,5 +8,5 @@ HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH invalid_pin flag_invalid_pin 1 +CATCH invalid_pin flag_invalid_pin 1 CATCH update_alias flag_allow_update 1 diff --git a/services/registration/my_balance.vis b/services/registration/my_balance.vis index b6094c0..166d18f 100644 --- a/services/registration/my_balance.vis +++ b/services/registration/my_balance.vis @@ -1,6 +1,6 @@ LOAD reset_incorrect 6 LOAD check_balance 0 -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 MAP check_balance CATCH incorrect_pin flag_incorrect_pin 1 CATCH pin_entry flag_account_authorized 0 diff --git a/services/registration/root.vis b/services/registration/root.vis index ec5b54e..035db83 100644 --- a/services/registration/root.vis +++ b/services/registration/root.vis @@ -9,7 +9,7 @@ CATCH terms flag_account_created 0 CATCH create_pin flag_pin_set 0 LOAD check_account_status 0 RELOAD check_account_status -CATCH api_failure flag_api_call_error 1 +CATCH api_failure flag_api_call_error 1 CATCH account_pending flag_account_pending 1 CATCH main flag_account_success 1 HALT From 37cc3e1bc19a35f479dc49f858c83bcbe62138c8 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 18:17:59 +0300 Subject: [PATCH 162/182] cleanup: remove extra space in all .vis files --- services/registration/my_account_alias.vis | 2 +- services/registration/old_pin.vis | 2 +- services/registration/pin_reset_result.vis | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/registration/my_account_alias.vis b/services/registration/my_account_alias.vis index 506f432..b2c48f8 100644 --- a/services/registration/my_account_alias.vis +++ b/services/registration/my_account_alias.vis @@ -5,4 +5,4 @@ HALT INCMP _ 0 LOAD request_custom_alias 0 RELOAD request_custom_alias -INCMP confirm_new_alias * +INCMP confirm_new_alias * diff --git a/services/registration/old_pin.vis b/services/registration/old_pin.vis index de66e2c..ccc2928 100644 --- a/services/registration/old_pin.vis +++ b/services/registration/old_pin.vis @@ -4,5 +4,5 @@ HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH invalid_pin flag_invalid_pin 1 +CATCH invalid_pin flag_invalid_pin 1 INCMP new_pin * diff --git a/services/registration/pin_reset_result.vis b/services/registration/pin_reset_result.vis index a676198..3412473 100644 --- a/services/registration/pin_reset_result.vis +++ b/services/registration/pin_reset_result.vis @@ -6,4 +6,4 @@ MOUT back 0 MOUT quit 9 HALT INCMP ^ 0 -INCMP quit 9 +INCMP quit 9 From 4d62f0222eef9980bb8774db7e601c27fa3ad85f Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:21:35 +0300 Subject: [PATCH 163/182] use the same check for flag_invalid_pin to move to the invalid_pin node --- services/registration/new_pin.vis | 2 +- services/registration/self_reset_pin.vis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 59e71e4..54f23ec 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -3,5 +3,5 @@ HALT INCMP _ 0 RELOAD save_temporary_pin RELOAD verify_new_pin -CATCH invalid_pin flag_valid_pin 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index 3439fcd..bb0adeb 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -4,5 +4,5 @@ LOAD save_temporary_pin 1 RELOAD save_temporary_pin LOAD verify_new_pin 2 RELOAD verify_new_pin -CATCH invalid_pin flag_valid_pin 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_self_pin_reset * From 131d106f38f1a67270eae1317af5182f9dd57bd2 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:23:46 +0300 Subject: [PATCH 164/182] use a single confirm_pin_change node --- services/registration/confirm_pin_change.vis | 4 ++-- services/registration/confirm_self_pin_reset | 1 - services/registration/confirm_self_pin_reset.vis | 7 ------- services/registration/confirm_self_pin_reset_swa | 1 - services/registration/self_reset_pin.vis | 2 +- 5 files changed, 3 insertions(+), 12 deletions(-) delete mode 100644 services/registration/confirm_self_pin_reset delete mode 100644 services/registration/confirm_self_pin_reset.vis delete mode 100644 services/registration/confirm_self_pin_reset_swa diff --git a/services/registration/confirm_pin_change.vis b/services/registration/confirm_pin_change.vis index 2077d23..419662b 100644 --- a/services/registration/confirm_pin_change.vis +++ b/services/registration/confirm_pin_change.vis @@ -1,7 +1,7 @@ -LOAD confirm_pin_change 0 MOUT back 0 HALT INCMP _ 0 +LOAD confirm_pin_change 0 RELOAD confirm_pin_change CATCH pin_mismatch flag_pin_mismatch 1 -INCMP pin_reset_success * \ No newline at end of file +INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset b/services/registration/confirm_self_pin_reset deleted file mode 100644 index 2e1b83e..0000000 --- a/services/registration/confirm_self_pin_reset +++ /dev/null @@ -1 +0,0 @@ -Confirm your new PIN: \ No newline at end of file diff --git a/services/registration/confirm_self_pin_reset.vis b/services/registration/confirm_self_pin_reset.vis deleted file mode 100644 index 419662b..0000000 --- a/services/registration/confirm_self_pin_reset.vis +++ /dev/null @@ -1,7 +0,0 @@ -MOUT back 0 -HALT -INCMP _ 0 -LOAD confirm_pin_change 0 -RELOAD confirm_pin_change -CATCH pin_mismatch flag_pin_mismatch 1 -INCMP pin_reset_success * diff --git a/services/registration/confirm_self_pin_reset_swa b/services/registration/confirm_self_pin_reset_swa deleted file mode 100644 index e407fec..0000000 --- a/services/registration/confirm_self_pin_reset_swa +++ /dev/null @@ -1 +0,0 @@ -Thibitisha PIN yako mpya: \ No newline at end of file diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index bb0adeb..5fa328f 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -5,4 +5,4 @@ RELOAD save_temporary_pin LOAD verify_new_pin 2 RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 -INCMP confirm_self_pin_reset * +INCMP confirm_pin_change * From 446514d8cef74327c1cfe67e76fce253c09f2890 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 19:29:40 +0300 Subject: [PATCH 165/182] remove unused function reset_valid_pin --- handlers/application/menuhandler.go | 8 -------- handlers/application/menuhandler_test.go | 24 ------------------------ handlers/local.go | 1 - 3 files changed, 33 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 8cea421..71fb767 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -289,14 +289,6 @@ func (h *MenuHandlers) CheckAccountCreated(ctx context.Context, sym string, inpu return res, nil } -// ResetValidPin resets the flag_valid_pin flag. -func (h *MenuHandlers) ResetValidPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - res.FlagReset = append(res.FlagReset, flag_valid_pin) - return res, nil -} - // CheckBlockedStatus: // 1. Checks whether the DATA_SELF_PIN_RESET is 1 and sets the flag_account_pin_reset // 2. resets the account blocked flag if the PIN attempts have been reset by an admin. diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 71a9256..74f659b 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -3047,30 +3047,6 @@ func TestResetOthersPin(t *testing.T) { assert.NoError(t, err) } -func TestResetValidPin(t *testing.T) { - ctx := context.Background() - - fm, err := NewFlagManager(flagsPath) - if err != nil { - t.Fatal(err) - } - flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") - - expectedResult := resource.Result{ - FlagReset: []uint32{flag_valid_pin}, - } - - h := &MenuHandlers{ - flagManager: fm, - } - - res, err := h.ResetValidPin(ctx, "reset_valid_pin", []byte("")) - - assert.NoError(t, err) - - assert.Equal(t, expectedResult, res) -} - func TestResetUnregisteredNumber(t *testing.T) { ctx := context.Background() diff --git a/handlers/local.go b/handlers/local.go index 905f673..07e0934 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -113,7 +113,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher) ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher) ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails) - ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin) ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber) ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber) ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber) From a6e569afb116812b88b321f7bb3a64e35aab7f9d Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 9 Apr 2025 23:40:03 +0300 Subject: [PATCH 166/182] remove the verify_new_pin functionality that managed the unused flag_valid_pin --- handlers/application/menuhandler.go | 23 ------------ handlers/application/menuhandler_test.go | 46 ------------------------ handlers/local.go | 1 - services/registration/new_pin.vis | 1 - services/registration/pin_management.vis | 1 - services/registration/self_reset_pin.vis | 2 -- 6 files changed, 74 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 71fb767..4292f11 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -364,29 +364,6 @@ func (h *MenuHandlers) ResetIncorrectPin(ctx context.Context, sym string, input return res, nil } -// VerifyNewPin checks if a new PIN meets the required format criteria. -func (h *MenuHandlers) VerifyNewPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { - res := resource.Result{} - _, ok := ctx.Value("SessionId").(string) - if !ok { - return res, fmt.Errorf("missing session") - } - flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") - if string(input) != "0" { - pinInput := string(input) - // Validate that the PIN is a 4-digit number. - if pin.IsValidPIN(pinInput) { - res.FlagSet = append(res.FlagSet, flag_valid_pin) - } else { - res.FlagReset = append(res.FlagReset, flag_valid_pin) - } - } else { - res.FlagSet = append(res.FlagSet, flag_valid_pin) - } - - return res, nil -} - // SaveTemporaryPin saves the valid PIN input to the DATA_TEMPORARY_VALUE, // during the account creation process // and during the change PIN process. diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 74f659b..6f9118b 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1843,52 +1843,6 @@ func TestGetProfile(t *testing.T) { } } -func TestVerifyNewPin(t *testing.T) { - sessionId := "session123" - - fm, _ := NewFlagManager(flagsPath) - mockState := state.NewState(16) - - flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") - mockAccountService := new(mocks.MockAccountService) - h := &MenuHandlers{ - flagManager: fm, - accountService: mockAccountService, - st: mockState, - } - ctx := context.WithValue(context.Background(), "SessionId", sessionId) - - tests := []struct { - name string - input []byte - expectedResult resource.Result - }{ - { - name: "Test with valid pin", - input: []byte("1234"), - expectedResult: resource.Result{ - FlagSet: []uint32{flag_valid_pin}, - }, - }, - { - name: "Test with invalid pin", - input: []byte("123"), - expectedResult: resource.Result{ - FlagReset: []uint32{flag_valid_pin}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - //Call the function under test - res, _ := h.VerifyNewPin(ctx, "verify_new_pin", tt.input) - - //Assert that the result set to content is what was expected - assert.Equal(t, res, tt.expectedResult, "Result should contain flags set according to user input") - }) - } -} - func TestConfirmPinChange(t *testing.T) { sessionId := "session123" diff --git a/handlers/local.go b/handlers/local.go index 07e0934..9f80e7e 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -104,7 +104,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("verify_yob", appHandlers.VerifyYob) ls.DbRs.AddLocalFunc("reset_incorrect_date_format", appHandlers.ResetIncorrectYob) ls.DbRs.AddLocalFunc("initiate_transaction", appHandlers.InitiateTransaction) - ls.DbRs.AddLocalFunc("verify_new_pin", appHandlers.VerifyNewPin) ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange) ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp) ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance) diff --git a/services/registration/new_pin.vis b/services/registration/new_pin.vis index 54f23ec..79e95ea 100644 --- a/services/registration/new_pin.vis +++ b/services/registration/new_pin.vis @@ -2,6 +2,5 @@ MOUT back 0 HALT INCMP _ 0 RELOAD save_temporary_pin -RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * diff --git a/services/registration/pin_management.vis b/services/registration/pin_management.vis index ca54ee4..01bd236 100644 --- a/services/registration/pin_management.vis +++ b/services/registration/pin_management.vis @@ -1,7 +1,6 @@ LOAD set_back 6 LOAD authorize_account 16 LOAD reset_allow_update 4 -LOAD verify_new_pin 2 LOAD save_temporary_pin 1 LOAD reset_incorrect 0 LOAD reset_invalid_pin 6 diff --git a/services/registration/self_reset_pin.vis b/services/registration/self_reset_pin.vis index 5fa328f..401a4e0 100644 --- a/services/registration/self_reset_pin.vis +++ b/services/registration/self_reset_pin.vis @@ -2,7 +2,5 @@ LOAD reset_invalid_pin 6 HALT LOAD save_temporary_pin 1 RELOAD save_temporary_pin -LOAD verify_new_pin 2 -RELOAD verify_new_pin CATCH invalid_pin flag_invalid_pin 1 INCMP confirm_pin_change * From af5537abfcfd922d07539b3a0e2d3749914c976c Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 10 Apr 2025 13:55:00 +0300 Subject: [PATCH 167/182] updated the description of DATA_SELF_PIN_RESET --- store/db/db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/db/db.go b/store/db/db.go index f7f7013..517d0a0 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -65,7 +65,7 @@ const ( DATA_ACCOUNT_ALIAS //currently suggested alias by the api awaiting user's confirmation as accepted account alias DATA_SUGGESTED_ALIAS - //currently suggested alias by the api awaiting user's confirmation as accepted account alias + //Key used to store a value of 1 for a user to reset their own PIN once they access the menu. DATA_SELF_PIN_RESET ) From 6cdee7b58bf781839eb2cd3712cb5604e6741744 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 16:25:59 +0300 Subject: [PATCH 168/182] update sarafu-api dep --- go.mod | 4 ++-- go.sum | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a65c56d..80a036d 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b - git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad + git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 github.com/gofrs/uuid v4.4.0+incompatible diff --git a/go.sum b/go.sum index 3b13a51..44d412e 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,14 @@ git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440 h1:eWrBZMM3pBMCFyRl4rO/aaR+OmOMFJxogNyFAFry+EM= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= From 5f24ff3b1b7d32ddfed5ccd434c4fa132ddf8955 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 1 Apr 2025 16:30:08 +0300 Subject: [PATCH 169/182] feat: send invites when a recipient is not resolved --- handlers/application/menuhandler.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 4292f11..22d9147 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1695,12 +1695,12 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp return res, fmt.Errorf("Data error encountered") } - // TODO - // send an invitation SMS - // if successful - // res.Content = l.Get("Your invitation to %s to join Sarafu Network has been sent.", string(recipient)) - - res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) + _, err := h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + if err != nil { + res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) + return res, nil + } + res.Content = l.Get("Your invitation to %s to join Sarafu Network has been sent.", string(recipient)) return res, nil } From 1499e4a29ae5b4c0db4eea7a5aaf6b1907bd102d Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 7 Apr 2025 11:38:52 +0300 Subject: [PATCH 170/182] check recipient before sending an sms --- handlers/application/menuhandler.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 22d9147..4bb52e7 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1689,13 +1689,18 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp l := gotext.NewLocale(translationDir, code) l.AddDomain("default") - recipient, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) - if len(recipient) == 0 { - logg.ErrorCtxf(ctx, "recipient is empty", "key", storedb.DATA_TEMPORARY_VALUE) - return res, fmt.Errorf("Data error encountered") + recipient, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + logg.ErrorCtxf(ctx, "Failed to read invalid recipient info", "error", err) + return res, err } - _, err := h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + if !phone.IsValidPhoneNumber(string(recipient)) { + logg.InfoCtxf(ctx, "corrupted recipient", "key", storedb.DATA_TEMPORARY_VALUE, "recipient", recipient) + return res, nil + } + + _, err = h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) if err != nil { res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) return res, nil From ce8cc8e0fd3b775e2b0cce2ef1ca7848c0f4643e Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Fri, 11 Apr 2025 11:10:48 +0300 Subject: [PATCH 171/182] use latest commit from sarafu-api --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 80a036d..0b44efa 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 44d412e..aae4f50 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 0ba65fc48c5b798c5425f41d14c069380c49c1a4 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Thu, 17 Apr 2025 14:31:18 +0300 Subject: [PATCH 172/182] use the updated phone and alias regexes from common --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0b44efa..c87a07b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce - git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d + git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 diff --git a/go.sum b/go.sum index aae4f50..273f1d4 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQ git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= +git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= +git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= From 5f02df64d7a3297d8fd9433b23328b22c2677b03 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 25 Apr 2025 18:28:43 +0300 Subject: [PATCH 173/182] upgrade visedriver dep --- go.mod | 4 ++-- go.sum | 14 ++------------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index c87a07b..50285ca 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce + git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 - git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 + git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 github.com/gofrs/uuid v4.4.0+incompatible diff --git a/go.sum b/go.sum index 273f1d4..43a999f 100644 --- a/go.sum +++ b/go.sum @@ -2,22 +2,12 @@ git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsT git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk= git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= -git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= -git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440 h1:eWrBZMM3pBMCFyRl4rO/aaR+OmOMFJxogNyFAFry+EM= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= -git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= +git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= From b52239e6be145a081d023dc145ca188194762fc1 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 28 Apr 2025 11:50:10 +0300 Subject: [PATCH 174/182] use direct key data type --- handlers/application/menuhandler.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 4bb52e7..35d948e 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -213,7 +213,7 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin } err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value)) if err != nil { - logg.DebugCtxf(ctx, "Failed to write log entry", "key", string(key), "value", value) + logg.DebugCtxf(ctx, "Failed to write log entry", "key", key, "value", value) } } publicKeyNormalized, err := hex.NormalizeHex(publicKey) @@ -432,7 +432,6 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ } store := h.userdataStore - logdb := h.logDb hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) From a5c4866b23d555bfef29f58b7825293e0a2f39bb Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 28 Apr 2025 11:50:25 +0300 Subject: [PATCH 175/182] add required logdb to menuhandler --- handlers/application/menuhandler_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 6f9118b..202588b 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -76,6 +76,7 @@ func InitializeTestSubPrefixDb(t *testing.T, ctx context.Context) *storedb.SubPr func TestNewMenuHandlers(t *testing.T) { _, store := InitializeTestStore(t) + logdb := memdb.NewMemDb() fm, err := NewFlagManager(flagsPath) if err != nil { @@ -86,7 +87,7 @@ func TestNewMenuHandlers(t *testing.T) { // Test case for valid UserDataStore t.Run("Valid UserDataStore", func(t *testing.T) { - handlers, err := NewMenuHandlers(fm, store, &accountService, mockReplaceSeparator) + handlers, err := NewMenuHandlers(fm, store, logdb, &accountService, mockReplaceSeparator) if err != nil { t.Fatalf("expected no error, got %v", err) } @@ -110,7 +111,7 @@ func TestNewMenuHandlers(t *testing.T) { // Test case for nil UserDataStore t.Run("Nil UserDataStore", func(t *testing.T) { - handlers, err := NewMenuHandlers(fm, nil, &accountService, mockReplaceSeparator) + handlers, err := NewMenuHandlers(fm, nil, logdb, &accountService, mockReplaceSeparator) if err == nil { t.Fatal("expected an error, got none") } @@ -194,6 +195,11 @@ func TestCreateAccount(t *testing.T) { sessionId := "session123" ctx, store := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + logdb := memdb.NewMemDb() + + logDb := store.LogDb{ + Db: logdb, + } fm, err := NewFlagManager(flagsPath) if err != nil { @@ -228,6 +234,7 @@ func TestCreateAccount(t *testing.T) { h := &MenuHandlers{ userdataStore: store, accountService: mockAccountService, + logDb: logDb, flagManager: fm, } @@ -2308,7 +2315,7 @@ func TestCheckBlockedStatus(t *testing.T) { { name: "Currently blocked account", currentWrongPinAttempts: "4", - expectedResult: resource.Result{ + expectedResult: resource.Result{ FlagReset: []uint32{flag_account_pin_reset}, }, }, From 78e82edfb5eede5bcaddee2a03ea6724df9b2dcd Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 28 Apr 2025 12:26:06 +0300 Subject: [PATCH 176/182] added the logdn to the menuhandler tests --- handlers/application/menuhandler_test.go | 146 +++++++++++++++++------ 1 file changed, 107 insertions(+), 39 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 202588b..bd0211c 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -62,6 +62,25 @@ func InitializeTestStore(t *testing.T) (context.Context, *store.UserDataStore) { return ctx, store } +// InitializeTestLogdbStore sets up and returns an in-memory database and logdb store. +func InitializeTestLogdbStore(t *testing.T) (context.Context, *store.UserDataStore) { + ctx := context.Background() + + // Initialize memDb + db := memdb.NewMemDb() + err := db.Connect(ctx, "") + require.NoError(t, err, "Failed to connect to memDb") + + // Create UserDataStore with memDb + logdb := &store.UserDataStore{Db: db} + + t.Cleanup(func() { + db.Close(ctx) // Ensure the DB is closed after each test + }) + + return ctx, logdb +} + func InitializeTestSubPrefixDb(t *testing.T, ctx context.Context) *storedb.SubPrefixDb { db := memdb.NewMemDb() err := db.Connect(ctx, "") @@ -76,7 +95,7 @@ func InitializeTestSubPrefixDb(t *testing.T, ctx context.Context) *storedb.SubPr func TestNewMenuHandlers(t *testing.T) { _, store := InitializeTestStore(t) - logdb := memdb.NewMemDb() + _, logdb := InitializeTestLogdbStore(t) fm, err := NewFlagManager(flagsPath) if err != nil { @@ -193,9 +212,9 @@ func TestInit(t *testing.T) { func TestCreateAccount(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) - logdb := memdb.NewMemDb() + _, logdb := InitializeTestLogdbStore(t) logDb := store.LogDb{ Db: logdb, @@ -232,9 +251,9 @@ func TestCreateAccount(t *testing.T) { mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, - logDb: logDb, + logDb: logDb, flagManager: fm, } @@ -272,8 +291,13 @@ func TestWithPersister_PanicWhenAlreadySet(t *testing.T) { func TestSaveFirstname(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -289,7 +313,7 @@ func TestSaveFirstname(t *testing.T) { // Define test data firstName := "John" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName)); err != nil { t.Fatal(err) } @@ -297,9 +321,10 @@ func TestSaveFirstname(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -310,14 +335,19 @@ func TestSaveFirstname(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_FIRST_NAME entry has been updated with the temporary value - storedFirstName, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME) + storedFirstName, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME) assert.Equal(t, firstName, string(storedFirstName)) } func TestSaveFamilyname(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -335,15 +365,16 @@ func TestSaveFamilyname(t *testing.T) { // Define test data familyName := "Doeee" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName)); err != nil { t.Fatal(err) } // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, st: mockState, flagManager: fm, + logDb: logDb, } // Call the method @@ -354,14 +385,19 @@ func TestSaveFamilyname(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_FAMILY_NAME entry has been updated with the temporary value - storedFamilyName, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME) + storedFamilyName, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME) assert.Equal(t, familyName, string(storedFamilyName)) } func TestSaveYoB(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -377,7 +413,7 @@ func TestSaveYoB(t *testing.T) { // Define test data yob := "1980" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob)); err != nil { t.Fatal(err) } @@ -385,9 +421,10 @@ func TestSaveYoB(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -398,14 +435,19 @@ func TestSaveYoB(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_YOB entry has been updated with the temporary value - storedYob, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_YOB) + storedYob, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_YOB) assert.Equal(t, yob, string(storedYob)) } func TestSaveLocation(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -421,7 +463,7 @@ func TestSaveLocation(t *testing.T) { // Define test data location := "Kilifi" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location)); err != nil { t.Fatal(err) } @@ -429,9 +471,10 @@ func TestSaveLocation(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -442,14 +485,19 @@ func TestSaveLocation(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_LOCATION entry has been updated with the temporary value - storedLocation, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION) + storedLocation, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION) assert.Equal(t, location, string(storedLocation)) } func TestSaveOfferings(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -465,7 +513,7 @@ func TestSaveOfferings(t *testing.T) { // Define test data offerings := "Bananas" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings)); err != nil { t.Fatal(err) } @@ -473,9 +521,10 @@ func TestSaveOfferings(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -486,14 +535,19 @@ func TestSaveOfferings(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_OFFERINGS entry has been updated with the temporary value - storedOfferings, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS) + storedOfferings, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS) assert.Equal(t, offerings, string(storedOfferings)) } func TestSaveGender(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -533,16 +587,17 @@ func TestSaveGender(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(tt.expectedGender)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(tt.expectedGender)); err != nil { t.Fatal(err) } mockState.ExecPath = append(mockState.ExecPath, tt.executingSymbol) // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, st: mockState, flagManager: fm, + logDb: logDb, } expectedResult := resource.Result{} @@ -557,7 +612,7 @@ func TestSaveGender(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_GENDER entry has been updated with the temporary value - storedGender, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER) + storedGender, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_GENDER) assert.Equal(t, tt.expectedGender, string(storedGender)) }) } @@ -1957,8 +2012,13 @@ func TestManageVouchers(t *testing.T) { sessionId := "session123" publicKey := "0X13242618721" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, err := NewFlagManager(flagsPath) if err != nil { @@ -1969,7 +2029,7 @@ func TestManageVouchers(t *testing.T) { t.Fatal(err) } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) if err != nil { t.Fatal(err) } @@ -2027,20 +2087,21 @@ func TestManageVouchers(t *testing.T) { mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, flagManager: fm, + logDb: logDb, } mockAccountService.On("FetchVouchers", string(publicKey)).Return(tt.vouchersResp, nil) // Store active voucher if needed if tt.storedActiveVoucher != "" { - err := store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) + err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) if err != nil { t.Fatal(err) } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) if err != nil { t.Fatal(err) } @@ -2052,12 +2113,12 @@ func TestManageVouchers(t *testing.T) { if tt.storedActiveVoucher != "" { // Validate stored voucher symbols - voucherData, err := store.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) + voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) assert.NoError(t, err) assert.Equal(t, tt.expectedVoucherSymbols, voucherData) // Validate stored active contract address - updatedAddress, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) + updatedAddress, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) assert.NoError(t, err) assert.Equal(t, tt.expectedUpdatedAddress, updatedAddress) @@ -2384,8 +2445,14 @@ func TestCheckTransactions(t *testing.T) { sessionId := "session123" publicKey := "0X13242618721" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } + spdb := InitializeTestSubPrefixDb(t, ctx) fm, err := NewFlagManager(flagsPath) @@ -2394,13 +2461,14 @@ func TestCheckTransactions(t *testing.T) { } h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, prefixDb: spdb, + logDb: logDb, flagManager: fm, } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) if err != nil { t.Fatal(err) } From ec1ddefeb3d01ebe8d500499301a63757a70bf70 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 28 Apr 2025 12:50:36 +0300 Subject: [PATCH 177/182] updated packages for sarafu-api and vise --- go.mod | 4 ++-- go.sum | 24 ++---------------------- 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index c020c18..31b4dc1 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 + git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 21aa5d0..1a2410d 100644 --- a/go.sum +++ b/go.sum @@ -1,29 +1,9 @@ -git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsTAnebrB6QxRbB7zdoTHSmzzumXrJ4hw= -git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk= git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= -git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= -git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440 h1:eWrBZMM3pBMCFyRl4rO/aaR+OmOMFJxogNyFAFry+EM= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1 h1:Yt9S+9JtCB4Y6jw6Xo1WGoVVu591n3/tSRIwM3kw1uY= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028 h1:HuIL9BClNieD7QCikCW1sJ9HyIo9iqRDFqULJGHxbrM= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b h1:0Ldq9SKqu+oNljNaKpQFyUgl3cOi6LJulGZwf5vXuWo= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c h1:fO8NGQ/sLdwpbi3UWzZZxqOXGrEzMVXyxER5ziGuZLI= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f h1:OAHCP3YR1C5h1WFnnEnLs5kn6jTxQHQYWYtQaMZJIMY= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 687447e73e9029a4945aa8ae3f6f60ac2e66753a Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Mon, 28 Apr 2025 15:09:38 +0300 Subject: [PATCH 178/182] added the logdb to the testutil engine --- testutil/engine.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/testutil/engine.go b/testutil/engine.go index 0cae8d4..531481d 100644 --- a/testutil/engine.go +++ b/testutil/engine.go @@ -113,6 +113,12 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userDataStore, "test-db-logs", "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { fmt.Fprintf(os.Stderr, "dbresource cast error") @@ -121,6 +127,7 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userDataStore) + lhs.SetLogDb(&logdb) lhs.SetPersister(pe) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) @@ -154,6 +161,7 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe en := lhs.GetEngine(lhs.Cfg, rs, pe) cleanFn := func() { + logdb.Close(ctx) err := en.Finish(ctx) if err != nil { logg.Errorf(err.Error()) From 29d35d1ec4e4de714d0eedc95bd2f2bb92aecef7 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Mon, 28 Apr 2025 15:49:40 +0300 Subject: [PATCH 179/182] add write of the temporary and confirmed account pins to the log db --- handlers/application/menuhandler.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index c8e3585..97b84ea 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -406,12 +406,19 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ } store := h.userdataStore + logdb := h.logDb + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) if err != nil { logg.ErrorCtxf(ctx, "failed to write temporaryAccountPIN entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", accountPIN, "error", err) return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write temporaryAccountPIN log entry", "key", storedb.DATA_TEMPORARY_VALUE, "value", accountPIN, "error", err) + } + return res, nil } @@ -439,6 +446,7 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ } store := h.userdataStore + logdb := h.logDb hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) @@ -462,6 +470,12 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "hashedPIN value", hashedTemporaryPin, "error", err) return res, err } + + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write AccountPIN log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) + } + // set the DATA_SELF_PIN_RESET as 0 err = store.WriteEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET, []byte("0")) if err != nil { @@ -482,6 +496,7 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") store := h.userdataStore + logdb := h.logDb sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -517,6 +532,11 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in return res, nil } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write blocked number log entry", "key", storedb.DATA_BLOCKED_NUMBER, "value", formattedNumber, "error", err) + } + return res, nil } @@ -643,6 +663,8 @@ func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input [] } store := h.userdataStore + logdb := h.logDb + hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) if err != nil { logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err) @@ -669,6 +691,11 @@ func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input [] return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write DATA_ACCOUNT_PIN log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) + } + return res, nil } From 06cab564277c58ee01e388cff6b95a22f9a79f28 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Tue, 29 Apr 2025 13:25:31 +0300 Subject: [PATCH 180/182] fix failing tests: menuhandlers missing the logdb --- handlers/application/menuhandler_test.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index e8f7974..7afe790 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -623,9 +623,15 @@ func TestSaveGender(t *testing.T) { func TestSaveTemporaryPin(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + + ctx, userdatastore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + logDb := store.LogDb{ + Db: logdb, + } + fm, err := NewFlagManager(flagsPath) if err != nil { log.Fatal(err) @@ -636,7 +642,8 @@ func TestSaveTemporaryPin(t *testing.T) { // Create the MenuHandlers instance with the mock flag manager h := &MenuHandlers{ flagManager: fm, - userdataStore: store, + userdataStore: userdatastore, + logDb: logDb, } // Define test cases @@ -677,9 +684,15 @@ func TestSaveTemporaryPin(t *testing.T) { func TestCheckIdentifier(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userdatastore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } + // Define test cases tests := []struct { name string @@ -699,14 +712,15 @@ func TestCheckIdentifier(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(tt.publicKey)) + err := userdatastore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(tt.publicKey)) if err != nil { t.Fatal(err) } // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userdatastore, + logDb: logDb, } // Call the method From 7b1676bb3768524889455b0ec2b2f1e9a714b111 Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 7 May 2025 11:45:38 +0200 Subject: [PATCH 181/182] fixes: recipient address and phone number (#74) - Add functionality to checksum addresses...resolves https://git.grassecon.net/grassrootseconomics/sarafu-vise/issues/66 - Remove white spaces from the recipient input...resolves https://git.grassecon.net/grassrootseconomics/sarafu-vise/issues/70 Reviewed-on: https://git.grassecon.net/grassrootseconomics/sarafu-vise/pulls/74 Reviewed-by: Mohamed Sohail Co-authored-by: alfred-mk Co-committed-by: alfred-mk --- go.mod | 26 ++++++++++ go.sum | 60 +++++++++++++++++++++++ handlers/application/menuhandler.go | 9 +++- handlers/application/menuhandler_test.go | 62 ++++++++++++++++++------ 4 files changed, 139 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 31b4dc1..3a3380e 100644 --- a/go.mod +++ b/go.mod @@ -19,24 +19,50 @@ require ( ) require ( + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect github.com/alecthomas/participle/v2 v2.0.0 // indirect github.com/alecthomas/repr v0.2.0 // indirect github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c // indirect + github.com/bits-and-blooms/bitset v1.14.3 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-ethereum v1.14.9 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/grassrootseconomics/eth-custodial v1.3.0-beta // indirect + github.com/grassrootseconomics/ethutils v1.3.1 // indirect github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/joho/godotenv v1.5.1 // indirect + github.com/lmittmann/w3 v0.17.1 // indirect github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/stretchr/objx v0.5.2 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/x448/float16 v0.8.4 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 1a2410d..190901f 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,10 @@ git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335- git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= @@ -16,21 +20,54 @@ github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE= github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U= +github.com/bits-and-blooms/bitset v1.14.3 h1:Gd2c8lSNf9pKXom5JtD7AaKO8o7fGQ2LtFj1436qilA= +github.com/bits-and-blooms/bitset v1.14.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.9 h1:J7iwXDrtUyE9FUjUYbd4c9tyzwMh6dTJsKzo9i6SrwA= +github.com/ethereum/go-ethereum v1.14.9/go.mod h1:QeW+MtTpRdBEm2pUFoonByee8zfHv7kGp0wK0odvU1I= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grassrootseconomics/eth-custodial v1.3.0-beta h1:twrMBhl89GqDUL9PlkzQxMP/6OST1BByrNDj+rqXDmU= github.com/grassrootseconomics/eth-custodial v1.3.0-beta/go.mod h1:7uhRcdnJplX4t6GKCEFkbeDhhjlcaGJeJqevbcvGLZo= +github.com/grassrootseconomics/ethutils v1.3.1 h1:LlQO90HjJkl7ejC8fv6jP7RJUrAm1j4VMMCYfsoIrhU= +github.com/grassrootseconomics/ethutils v1.3.1/go.mod h1:Wuv1VEZrkLIXqTSEYI3Nh9HG/ZHOUQ+U+xvWJ8QtjgQ= github.com/grassrootseconomics/ussd-data-service v1.2.0-beta h1:fn1gwbWIwHVEBtUC2zi5OqTlfI/5gU1SMk0fgGixIXk= github.com/grassrootseconomics/ussd-data-service v1.2.0-beta/go.mod h1:omfI0QtUwIdpu9gMcUqLMCG8O1XWjqJGBx1qUMiGWC0= github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 h1:U4kkNYryi/qfbBF8gh7Vsbuz+cVmhf5kt6pE9bYYyLo= github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4/go.mod h1:zpZDgZFzeq9s0MIeB1P50NIEWDFFHSFBohI/NbaTD/Y= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -45,8 +82,13 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lmittmann/w3 v0.17.1 h1:zdXIimmNmYfqOFur+Jqc9Yqwtq6jwnsQufbTOnSAtW4= +github.com/lmittmann/w3 v0.17.1/go.mod h1:WVUGMbL83WYBu4Sge3SVlW3qIG4VaHe+S8+UUnwz9Eg= github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a h1:0Q3H0YXzMHiciXtRcM+j0jiCe8WKPQHoRgQiRTnfcLY= github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a/go.mod h1:CdTTBOYzS5E4mWS1N8NWP6AHI19MP0A2B18n3hLzRMk= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/pashagolub/pgxmock/v4 v4.3.0 h1:DqT7fk0OCK6H0GvqtcMsLpv8cIwWqdxWgfZNLeHCb/s= github.com/pashagolub/pgxmock/v4 v4.3.0/go.mod h1:9VoVHXwS3XR/yPtKGzwQvwZX1kzGB9sM8SviDcHDa3A= github.com/peteole/testdata-loader v0.3.0 h1:8jckE9KcyNHgyv/VPoaljvKZE0Rqr8+dPVYH6rfNr9I= @@ -56,6 +98,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= @@ -63,18 +107,32 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -83,3 +141,5 @@ gopkg.in/leonelquinteros/gotext.v1 v1.3.1/go.mod h1:X1WlGDeAFIYsW6GjgMm4VwUwZ2Xj gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 7178188..ba70bf8 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -33,6 +33,7 @@ import ( "git.grassecon.net/grassrootseconomics/sarafu-vise/profile" "git.grassecon.net/grassrootseconomics/sarafu-vise/store" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" + "github.com/grassrootseconomics/ethutils" dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api" ) @@ -1622,7 +1623,8 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite") flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") - recipient := string(input) + // remove white spaces + recipient := strings.ReplaceAll(string(input), " ", "") if recipient != "0" { recipientType, err := identity.CheckRecipient(recipient) @@ -1672,8 +1674,11 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input } case "address": + // checksum the address + address := ethutils.ChecksumAddress(recipient) + // Save the valid Ethereum address as the recipient - err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(recipient)) + err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(address)) if err != nil { logg.ErrorCtxf(ctx, "failed to write recipient entry with", "key", storedb.DATA_RECIPIENT, "value", recipient, "error", err) return res, err diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 7afe790..d07e0cc 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1716,40 +1716,64 @@ func TestValidateRecipient(t *testing.T) { // Define test cases tests := []struct { - name string - input []byte - expectedResult resource.Result + name string + input []byte + expectError bool + expectedRecipient []byte + expectedResult resource.Result }{ { - name: "Test with invalid recepient", - input: []byte("7?1234"), + name: "Test with invalid recepient", + input: []byte("7?1234"), + expectError: true, expectedResult: resource.Result{ FlagSet: []uint32{flag_invalid_recipient}, Content: "7?1234", }, }, { - name: "Test with valid unregistered recepient", - input: []byte("0712345678"), + name: "Test with valid unregistered recepient", + input: []byte("0712345678"), + expectError: true, expectedResult: resource.Result{ FlagSet: []uint32{flag_invalid_recipient_with_invite}, Content: "0712345678", }, }, { - name: "Test with valid registered recepient", - input: []byte("0711223344"), - expectedResult: resource.Result{}, + name: "Test with valid registered recepient", + input: []byte("0711223344"), + expectError: false, + expectedRecipient: []byte(publicKey), + expectedResult: resource.Result{}, }, { - name: "Test with address", - input: []byte("0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9"), - expectedResult: resource.Result{}, + name: "Test with address", + input: []byte("0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9"), + expectError: false, + expectedRecipient: []byte("0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9"), + expectedResult: resource.Result{}, }, { - name: "Test with alias recepient", - input: []byte("alias123.sarafu.local"), - expectedResult: resource.Result{}, + name: "Test with alias recepient", + input: []byte("alias123.sarafu.local"), + expectError: false, + expectedRecipient: []byte("0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9"), + expectedResult: resource.Result{}, + }, + { + name: "Test for checksummed address", + input: []byte("0x5523058cdffe5f3c1eadadd5015e55c6e00fb439"), + expectError: false, + expectedRecipient: []byte("0x5523058cdFfe5F3c1EaDADD5015E55C6E00fb439"), + expectedResult: resource.Result{}, + }, + { + name: "Test with valid registered recepient that has white spaces", + input: []byte("0711 22 33 44"), + expectError: false, + expectedRecipient: []byte(publicKey), + expectedResult: resource.Result{}, }, } @@ -1782,6 +1806,12 @@ func TestValidateRecipient(t *testing.T) { t.Error(err) } + if !tt.expectError { + storedRecipientAddress, err := store.ReadEntry(ctx, sessionId, storedb.DATA_RECIPIENT) + assert.NoError(t, err) + assert.Equal(t, tt.expectedRecipient, storedRecipientAddress) + } + // Assert that the Result FlagSet has the required flags after language switch assert.Equal(t, res, tt.expectedResult, "Result should contain flag(s) that have been reset") }) From e914d059e26b02baa91a1e44e284fea73669860c Mon Sep 17 00:00:00 2001 From: alfred-mk Date: Wed, 7 May 2025 20:26:54 +0300 Subject: [PATCH 182/182] upgraded vise to refresh error logline for more context --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 3a3380e..d7a837f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise go 1.23.4 require ( - git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce + git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9 git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 diff --git a/go.sum b/go.sum index 190901f..75de564 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk= git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= +git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9 h1:4kjbYw25MHZe9fqSbujPzpFXrYutFfVipvLrcWYnYks= +git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f h1:OAHCP3YR1C5h1WFnnEnLs5kn6jTxQHQYWYtQaMZJIMY=