wip-account-creation #4

Merged
lash merged 143 commits from wip-account-creation into master 2024-08-30 14:37:58 +02:00
20 changed files with 175 additions and 23 deletions
Showing only changes of commit c556e88916 - Show all commits

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"bytes"
"context" "context"
"encoding/json" "encoding/json"
"flag" "flag"
@ -13,6 +14,7 @@ import (
"git.defalsify.org/vise.git/cache" "git.defalsify.org/vise.git/cache"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/lang"
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/resource"
"git.defalsify.org/vise.git/state" "git.defalsify.org/vise.git/state"
@ -28,6 +30,11 @@ const (
USERFLAG_INVALID_RECIPIENT_WITH_INVITE USERFLAG_INVALID_RECIPIENT_WITH_INVITE
USERFLAG_INCORRECTPIN USERFLAG_INCORRECTPIN
USERFLAG_UNLOCKFORUPDATE USERFLAG_UNLOCKFORUPDATE
USERFLAG_INVALID_AMOUNT
USERFLAG_QUERYPIN
USERFLAG_VALIDPIN
USERFLAG_INVALIDPIN
USERFLAG_UNLOCKFORUPDATE
Alfred-mk marked this conversation as resolved Outdated
Outdated
Review

please rename this flag to USERFLAG_PINMISMATCH to avoid ambiguity.

please rename this flag to USERFLAG_PINMISMATCH to avoid ambiguity.
Outdated
Review

priority

**priority**
) )
const ( const (
@ -71,6 +78,16 @@ type fsData struct {
st *state.State st *state.State
} }
func codeFromCtx(ctx context.Context) string {
var code string
engine.Logg.DebugCtxf(ctx, "in msg", "ctx", ctx, "val", code)
if ctx.Value("Language") != nil {
lang := ctx.Value("Language").(lang.Language)
code = lang.Code
}
return code
}
func (fsd *fsData) saveFirstName(cxt context.Context, sym string, input []byte) (resource.Result, error) { func (fsd *fsData) saveFirstName(cxt context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{} res := resource.Result{}
fp := fsd.path + "_data" fp := fsd.path + "_data"
@ -484,8 +501,12 @@ func checkAccountStatus(trackingId string) (string, error) {
} }
func (fsd *fsData) quit(ctx context.Context, sym string, input []byte) (resource.Result, error) { func (fsd *fsData) quit(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{ res := resource.Result{}
Content: "Your account is being created", switch codeFromCtx(ctx) {
case "swa":
res.Content = "Asante kwa kutumia huduma ya Sarafu. Kwaheri!"
default:
res.Content = "Thank you for using Sarafu. Goodbye!"
} }
res.FlagReset = append(res.FlagReset, USERFLAG_ACCOUNT_UNLOCKED) res.FlagReset = append(res.FlagReset, USERFLAG_ACCOUNT_UNLOCKED)
return res, nil return res, nil
@ -606,6 +627,39 @@ func (fsd *fsData) transaction_reset(ctx context.Context, sym string, input []by
return res, nil return res, nil
} }
func (fsd *fsData) reset_transaction_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
// reset the amount
accountData["Amount"] = ""
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
res.FlagReset = append(res.FlagReset, USERFLAG_INVALID_AMOUNT)
return res, nil
}
func (fsd *fsData) max_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) { func (fsd *fsData) max_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{} res := resource.Result{}
@ -632,28 +686,32 @@ func (fsd *fsData) validate_amount(ctx context.Context, sym string, input []byte
return res, err return res, err
} }
// mimic invalid amount check if amount != "0" {
if amount == "0" { // mimic invalid amount
// res.FlagSet = []uint32{invalidAmount} if amount == "00" {
res.FlagSet = append(res.FlagSet, USERFLAG_INVALID_AMOUNT)
res.Content = amount
return res, nil
}
res.Content = amount res.Content = amount
accountData["Amount"] = amount
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
Alfred-mk marked this conversation as resolved Outdated
Outdated
Review

Since the balance is already available, should check that input is not more than balance.

Since the balance is already available, should check that input is not more than balance.
Outdated
Review

priority

**priority**
return res, nil return res, nil
} }
res.Content = amount
accountData["Amount"] = amount
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
if err != nil {
return res, err
}
return res, nil return res, nil
} }
@ -762,6 +820,62 @@ func (fsd *fsData) quitWithBalance(ctx context.Context, sym string, input []byte
return res, nil return res, nil
} }
func (fsd *fsData) save_pin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
accountPIN := string(input)
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
accountData["AccountPIN"] = accountPIN
updatedJsonData, err := json.Marshal(accountData)
if err != nil {
return res, err
}
err = os.WriteFile(fp, updatedJsonData, 0644)
Alfred-mk marked this conversation as resolved Outdated
Outdated
Review

The page says four digit PIN, so the input must be checked here.

The page says four digit PIN, so the input must be checked here.
Outdated
Review

priority

**priority**
if err != nil {
return res, err
}
return res, nil
}
func (fsd *fsData) verify_pin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
res := resource.Result{}
fp := fsd.path + "_data"
jsonData, err := os.ReadFile(fp)
if err != nil {
return res, err
}
Alfred-mk marked this conversation as resolved Outdated
Outdated
Review

could clients of this reuse the pinentry used for unlock instead?

could clients of this reuse the pinentry used for `unlock` instead?

This sets a flag that shows the account has a PIN. Due to the difference in functionality I saw it best to use it instead of "unlock"

This sets a flag that shows the account has a PIN. Due to the difference in functionality I saw it best to use it instead of "unlock"
var accountData map[string]string
err = json.Unmarshal(jsonData, &accountData)
if err != nil {
return res, err
}
if bytes.Equal(input, []byte(accountData["AccountPIN"])) {
res.FlagSet = []uint32{USERFLAG_VALIDPIN}
res.FlagReset = []uint32{USERFLAG_INVALIDPIN}
} else {
res.FlagSet = []uint32{USERFLAG_INVALIDPIN}
}
return res, nil
}
var ( var (
scriptDir = path.Join("services", "registration") scriptDir = path.Join("services", "registration")
) )
@ -779,7 +893,7 @@ func main() {
fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir) fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir)
ctx := context.Background() ctx := context.Background()
st := state.NewState(9) st := state.NewState(15)
st.UseDebug() st.UseDebug()
state.FlagDebugger.Register(USERFLAG_LANGUAGE_SET, "LANGUAGE_CHANGE") state.FlagDebugger.Register(USERFLAG_LANGUAGE_SET, "LANGUAGE_CHANGE")
state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED, "ACCOUNT_CREATED") state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED, "ACCOUNT_CREATED")
@ -823,6 +937,8 @@ func main() {
} }
rfs.AddLocalFunc("select_language", fs.SetLanguageSelected) rfs.AddLocalFunc("select_language", fs.SetLanguageSelected)
rfs.AddLocalFunc("create_account", fs.create_account) rfs.AddLocalFunc("create_account", fs.create_account)
rfs.AddLocalFunc("save_pin", fs.save_pin)
rfs.AddLocalFunc("verify_pin", fs.verify_pin)
rfs.AddLocalFunc("check_identifier", fs.checkIdentifier) rfs.AddLocalFunc("check_identifier", fs.checkIdentifier)
rfs.AddLocalFunc("check_account_status", fs.check_account_status) rfs.AddLocalFunc("check_account_status", fs.check_account_status)
rfs.AddLocalFunc("unlock_account", fs.unLock) rfs.AddLocalFunc("unlock_account", fs.unLock)
@ -832,6 +948,7 @@ func main() {
rfs.AddLocalFunc("transaction_reset", fs.transaction_reset) rfs.AddLocalFunc("transaction_reset", fs.transaction_reset)
rfs.AddLocalFunc("max_amount", fs.max_amount) rfs.AddLocalFunc("max_amount", fs.max_amount)
rfs.AddLocalFunc("validate_amount", fs.validate_amount) rfs.AddLocalFunc("validate_amount", fs.validate_amount)
rfs.AddLocalFunc("reset_transaction_amount", fs.reset_transaction_amount)
rfs.AddLocalFunc("get_recipient", fs.get_recipient) rfs.AddLocalFunc("get_recipient", fs.get_recipient)
rfs.AddLocalFunc("get_sender", fs.get_sender) rfs.AddLocalFunc("get_sender", fs.get_sender)
rfs.AddLocalFunc("reset_incorrect", fs.ResetIncorrectPin) rfs.AddLocalFunc("reset_incorrect", fs.ResetIncorrectPin)

View File

@ -1,4 +1,4 @@
LOAD create_account 0 RELOAD verify_pin
CATCH create_pin_mismatch 20 1
LOAD quit 0 LOAD quit 0
HALT HALT

View File

@ -1,3 +1,4 @@
LOAD reset_transaction_amount 0
RELOAD validate_recipient RELOAD validate_recipient
CATCH invalid_recipient 13 1 CATCH invalid_recipient 13 1
LOAD max_amount 10 LOAD max_amount 10

View File

@ -0,0 +1,2 @@
Kiwango cha juu: {{.max_amount}}
Weka kiwango:

View File

@ -0,0 +1 @@
Enter your four number PIN again:

View File

@ -0,0 +1,4 @@
LOAD save_pin 0
HALT
LOAD verify_pin 8
INCMP account_creation *

View File

@ -0,0 +1 @@
Weka PIN yako tena:

View File

@ -0,0 +1 @@
Please enter a new four number PIN for your account:

View File

@ -0,0 +1,5 @@
LOAD create_account 0
MOUT exit 0
Alfred-mk marked this conversation as resolved Outdated
Outdated
Review

This is not caught

This is not caught
Outdated
Review

priority

**priority**
HALT
LOAD save_pin 0
INCMP confirm_create_pin *

View File

@ -0,0 +1 @@
The PIN is not a match. Try again

View File

@ -0,0 +1,5 @@
MOUT retry 1
MOUT quit 9
HALT
INCMP confirm_create_pin 1
INCMP quit 9
Alfred-mk marked this conversation as resolved
Review

if quit is chosen, next time the vm is started, the pin creation is never resumed, it just goes directly to main menu. It should prompt for setting pin again.

if quit is chosen, next time the vm is started, the pin creation is never resumed, it just goes directly to main menu. It should prompt for setting pin again.

View File

@ -0,0 +1 @@
PIN uliyoweka haifanani. Jaribu tena

View File

@ -0,0 +1 @@
Tafadhali weka PIN mpya yenye nambari nne kwa akaunti yako:

View File

@ -0,0 +1 @@
Exit

View File

@ -0,0 +1 @@
Ondoka

View File

@ -0,0 +1 @@
Amount {{.validate_amount}} is invalid, please try again:

View File

@ -0,0 +1,7 @@
MAP validate_amount
RELOAD reset_transaction_amount
MOUT retry 1
MOUT quit 9
HALT
INCMP amount 1
INCMP quit 9

View File

@ -0,0 +1 @@
Kiwango {{.validate_amount}} sio sahihi, tafadhali weka tena:

View File

@ -3,5 +3,5 @@ RELOAD select_language
MOUT yes 0 MOUT yes 0
MOUT no 1 MOUT no 1
HALT HALT
INCMP account_creation 0 INCMP create_pin 0
INCMP _ * INCMP _ *

View File

@ -1,5 +1,6 @@
RELOAD validate_amount RELOAD validate_amount
MAP validate_amount MAP validate_amount
CATCH invalid_amount 17 1
RELOAD get_recipient RELOAD get_recipient
MAP get_recipient MAP get_recipient
RELOAD get_sender RELOAD get_sender