alfred/test-updates #15
| @ -81,6 +81,7 @@ func main() { | |||||||
| 		OutputSize:    uint32(size), | 		OutputSize:    uint32(size), | ||||||
| 		FlagCount:     uint32(128), | 		FlagCount:     uint32(128), | ||||||
| 		MenuSeparator: menuSeparator, | 		MenuSeparator: menuSeparator, | ||||||
|  | 		ResetOnEmptyInput: true, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if engineDebug { | 	if engineDebug { | ||||||
| @ -133,6 +134,7 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	rp := &at.ATRequestParser{} | 	rp := &at.ATRequestParser{} | ||||||
| 	bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | 	bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | ||||||
|  | 	bsh = bsh.WithEngineFunc(lhs.GetEngine) | ||||||
| 	sh := at.NewATRequestHandler(bsh) | 	sh := at.NewATRequestHandler(bsh) | ||||||
| 
 | 
 | ||||||
| 	mux := http.NewServeMux() | 	mux := http.NewServeMux() | ||||||
|  | |||||||
| @ -1,12 +1,15 @@ | |||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"bufio" | ||||||
| 	"context" | 	"context" | ||||||
| 	"flag" | 	"flag" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"io" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"path" | 	"path" | ||||||
|  | 	"strings" | ||||||
| 	"syscall" | 	"syscall" | ||||||
| 
 | 
 | ||||||
| 	"git.defalsify.org/vise.git/engine" | 	"git.defalsify.org/vise.git/engine" | ||||||
| @ -93,6 +96,7 @@ func main() { | |||||||
| 		OutputSize:    uint32(size), | 		OutputSize:    uint32(size), | ||||||
| 		FlagCount:     uint32(128), | 		FlagCount:     uint32(128), | ||||||
| 		MenuSeparator: menuSeparator, | 		MenuSeparator: menuSeparator, | ||||||
|  | 		ResetOnEmptyInput: true, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if engineDebug { | 	if engineDebug { | ||||||
| @ -127,7 +131,6 @@ func main() { | |||||||
| 	lhs.SetDataStore(&userdataStore) | 	lhs.SetDataStore(&userdataStore) | ||||||
| 
 | 
 | ||||||
| 	accountService := services.New(ctx, menuStorageService) | 	accountService := services.New(ctx, menuStorageService) | ||||||
| 
 |  | ||||||
| 	hl, err := lhs.GetHandler(accountService) | 	hl, err := lhs.GetHandler(accountService) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		fmt.Fprintf(os.Stderr, err.Error()) | 		fmt.Fprintf(os.Stderr, err.Error()) | ||||||
| @ -145,6 +148,8 @@ func main() { | |||||||
| 		sessionId: sessionId, | 		sessionId: sessionId, | ||||||
| 	} | 	} | ||||||
| 	sh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | 	sh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | ||||||
|  | 	sh = sh.WithEngineFunc(lhs.GetEngine) | ||||||
|  | 
 | ||||||
| 	cfg.SessionId = sessionId | 	cfg.SessionId = sessionId | ||||||
| 	rqs := request.RequestSession{ | 	rqs := request.RequestSession{ | ||||||
| 		Ctx:    ctx, | 		Ctx:    ctx, | ||||||
| @ -184,11 +189,19 @@ func main() { | |||||||
| 			os.Exit(1) | 			os.Exit(1) | ||||||
| 		} | 		} | ||||||
| 		fmt.Println("") | 		fmt.Println("") | ||||||
| 		_, err = fmt.Scanln(&rqs.Input) | 		in := bufio.NewReader(os.Stdin) | ||||||
|  | 		s, err := in.ReadString('\n') | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | 			if err == io.EOF { | ||||||
|  | 				logg.DebugCtxf(ctx, "have EOF, bailing") | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
| 			logg.ErrorCtxf(ctx, "error in input", "err", err) | 			logg.ErrorCtxf(ctx, "error in input", "err", err) | ||||||
| 			fmt.Errorf("error in input: %v", err) | 			fmt.Errorf("error in input: %v", err) | ||||||
| 			os.Exit(1) | 			os.Exit(1) | ||||||
| 		} | 		} | ||||||
|  | 		rqs.Input = []byte{} | ||||||
|  | 		s = strings.TrimSpace(s) | ||||||
|  | 		rqs.Input = []byte(s) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -82,6 +82,7 @@ func main() { | |||||||
| 		OutputSize:    uint32(size), | 		OutputSize:    uint32(size), | ||||||
| 		FlagCount:     uint32(128), | 		FlagCount:     uint32(128), | ||||||
| 		MenuSeparator: menuSeparator, | 		MenuSeparator: menuSeparator, | ||||||
|  | 		ResetOnEmptyInput: true, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if engineDebug { | 	if engineDebug { | ||||||
| @ -133,6 +134,7 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	rp := &httprequest.DefaultRequestParser{} | 	rp := &httprequest.DefaultRequestParser{} | ||||||
| 	bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | 	bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) | ||||||
|  | 	bsh = bsh.WithEngineFunc(lhs.GetEngine) | ||||||
| 	sh := httprequest.NewHTTPRequestHandler(bsh) | 	sh := httprequest.NewHTTPRequestHandler(bsh) | ||||||
| 	s := &http.Server{ | 	s := &http.Server{ | ||||||
| 		Addr:    fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), | 		Addr:    fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								cmd/main.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								cmd/main.go
									
									
									
									
									
								
							| @ -79,6 +79,8 @@ func main() { | |||||||
| 		OutputSize:    uint32(size), | 		OutputSize:    uint32(size), | ||||||
| 		FlagCount:     uint32(128), | 		FlagCount:     uint32(128), | ||||||
| 		MenuSeparator: menuSeparator, | 		MenuSeparator: menuSeparator, | ||||||
|  | 		EngineDebug: engineDebug, | ||||||
|  | 		ResetOnEmptyInput: true, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	menuStorageService := storage.NewMenuStorageService(conns) | 	menuStorageService := storage.NewMenuStorageService(conns) | ||||||
| @ -124,17 +126,12 @@ func main() { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	accountService := services.New(ctx, menuStorageService) | 	accountService := services.New(ctx, menuStorageService) | ||||||
| 	hl, err := lhs.GetHandler(accountService) | 	_, err = lhs.GetHandler(accountService) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 	       fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err) | 	       fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err) | ||||||
| 	       os.Exit(1) | 	       os.Exit(1) | ||||||
| 	} | 	} | ||||||
| 
 | 	en := lhs.GetEngine(cfg, rs, pe) | ||||||
| 	en := lhs.GetEngine() |  | ||||||
| 	en = en.WithFirst(hl.Init) |  | ||||||
| 	if engineDebug { |  | ||||||
| 		en = en.WithDebug(nil) |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	cint := make(chan os.Signal) | 	cint := make(chan os.Signal) | ||||||
| 	cterm := make(chan os.Signal) | 	cterm := make(chan os.Signal) | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ func main() { | |||||||
| 		Root:       "root", | 		Root:       "root", | ||||||
| 		OutputSize: uint32(size), | 		OutputSize: uint32(size), | ||||||
| 		FlagCount:  uint32(128), | 		FlagCount:  uint32(128), | ||||||
|  | 		ResetOnEmptyInput: true, | ||||||
| 	} | 	} | ||||||
| 	if stateDebug { | 	if stateDebug { | ||||||
| 		cfg.StateDebug = true | 		cfg.StateDebug = true | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							| @ -3,11 +3,11 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise | |||||||
| go 1.23.4 | go 1.23.4 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 | 	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/common v0.0.0-20250121134736-ba8cbbccea7d | ||||||
| 	git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 | 	git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 | ||||||
| 	git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa | 	git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 | ||||||
| 	git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 | 	git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 | ||||||
| 	github.com/alecthomas/assert/v2 v2.2.2 | 	github.com/alecthomas/assert/v2 v2.2.2 | ||||||
| 	github.com/gofrs/uuid v4.4.0+incompatible | 	github.com/gofrs/uuid v4.4.0+incompatible | ||||||
| 	github.com/grassrootseconomics/ussd-data-service v1.2.0-beta | 	github.com/grassrootseconomics/ussd-data-service v1.2.0-beta | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,13 +1,13 @@ | |||||||
| git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 h1:sPcqXQcywxA8W3W+9qQncLPmsrgqTIlec7vmD4/7vyA= | 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.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= | git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac/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 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.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= | ||||||
| git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 h1:BJHfokTHzrw9QjQ+4s2HmSER0iBPuE7byW5oQC2zLIQ= | git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 h1:BJHfokTHzrw9QjQ+4s2HmSER0iBPuE7byW5oQC2zLIQ= | ||||||
| git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= | git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa h1:yQLKwby3eD/zNjNw/INU5lGiLuWPEHdsgASwMA4UptE= | git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk= | 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-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk= | git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= | 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= | 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/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= | ||||||
| github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= | github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= | ||||||
|  | |||||||
| @ -123,12 +123,6 @@ func (h *MenuHandlers) Init(ctx context.Context, sym string, input []byte) (reso | |||||||
| 
 | 
 | ||||||
| 	h.st = h.pe.GetState() | 	h.st = h.pe.GetState() | ||||||
| 	h.ca = h.pe.GetMemory() | 	h.ca = h.pe.GetMemory() | ||||||
| 
 |  | ||||||
| 	if len(input) == 0 { |  | ||||||
| 		// move to the top node
 |  | ||||||
| 		h.st.Code = []byte{} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	sessionId, ok := ctx.Value("SessionId").(string) | 	sessionId, ok := ctx.Value("SessionId").(string) | ||||||
| 	if ok { | 	if ok { | ||||||
| 		ctx = context.WithValue(ctx, "SessionId", sessionId) | 		ctx = context.WithValue(ctx, "SessionId", sessionId) | ||||||
| @ -324,6 +318,7 @@ func (h *MenuHandlers) VerifyNewPin(ctx context.Context, sym string, input []byt | |||||||
| 		return res, fmt.Errorf("missing session") | 		return res, fmt.Errorf("missing session") | ||||||
| 	} | 	} | ||||||
| 	flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") | 	flag_valid_pin, _ := h.flagManager.GetFlag("flag_valid_pin") | ||||||
|  | 	if !h.st.Back() { | ||||||
| 		pinInput := string(input) | 		pinInput := string(input) | ||||||
| 		// Validate that the PIN is a 4-digit number.
 | 		// Validate that the PIN is a 4-digit number.
 | ||||||
| 		if pin.IsValidPIN(pinInput) { | 		if pin.IsValidPIN(pinInput) { | ||||||
| @ -331,6 +326,9 @@ func (h *MenuHandlers) VerifyNewPin(ctx context.Context, sym string, input []byt | |||||||
| 		} else { | 		} else { | ||||||
| 			res.FlagReset = append(res.FlagReset, flag_valid_pin) | 			res.FlagReset = append(res.FlagReset, flag_valid_pin) | ||||||
| 		} | 		} | ||||||
|  | 	} else { | ||||||
|  | 		res.FlagSet = append(res.FlagSet, flag_valid_pin) | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return res, nil | 	return res, nil | ||||||
| } | } | ||||||
| @ -418,6 +416,11 @@ func (h *MenuHandlers) CheckBlockedNumPinMisMatch(ctx context.Context, sym strin | |||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return res, fmt.Errorf("missing session") | 		return res, fmt.Errorf("missing session") | ||||||
| 	} | 	} | ||||||
|  | 	if h.st.Back() { | ||||||
|  | 		res.FlagReset = append(res.FlagReset, flag_pin_mismatch) | ||||||
|  | 		return res, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// Get blocked number from storage.
 | 	// Get blocked number from storage.
 | ||||||
| 	store := h.userdataStore | 	store := h.userdataStore | ||||||
| 	blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) | 	blockedNumber, err := store.ReadEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER) | ||||||
| @ -448,6 +451,11 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [ | |||||||
| 	} | 	} | ||||||
| 	flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") | 	flag_pin_mismatch, _ := h.flagManager.GetFlag("flag_pin_mismatch") | ||||||
| 
 | 
 | ||||||
|  | 	if h.st.Back() { | ||||||
|  | 		res.FlagReset = append(res.FlagReset, flag_pin_mismatch) | ||||||
|  | 		return res, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	store := h.userdataStore | 	store := h.userdataStore | ||||||
| 	hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) | 	hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -579,6 +587,11 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in | |||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return res, fmt.Errorf("missing session") | 		return res, fmt.Errorf("missing session") | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if h.st.Back() { | ||||||
|  | 		res.FlagReset = append(res.FlagReset, flag_unregistered_number) | ||||||
|  | 		return res, nil | ||||||
|  | 	} | ||||||
| 	blockedNumber := string(input) | 	blockedNumber := string(input) | ||||||
| 	_, err = store.ReadEntry(ctx, blockedNumber, storedb.DATA_PUBLIC_KEY) | 	_, err = store.ReadEntry(ctx, blockedNumber, storedb.DATA_PUBLIC_KEY) | ||||||
| 	if !phone.IsValidPhoneNumber(blockedNumber) { | 	if !phone.IsValidPhoneNumber(blockedNumber) { | ||||||
| @ -1217,7 +1230,9 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) | |||||||
| 		logg.ErrorCtxf(ctx, "failed to read AccountPin entry with", "key", storedb.DATA_ACCOUNT_PIN, "error", err) | 		logg.ErrorCtxf(ctx, "failed to read AccountPin entry with", "key", storedb.DATA_ACCOUNT_PIN, "error", err) | ||||||
| 		return res, err | 		return res, err | ||||||
| 	} | 	} | ||||||
| 	if len(input) == 4 { | 	str := string(input) | ||||||
|  | 	_, err = strconv.Atoi(str) | ||||||
|  | 	if len(input) == 4 && err == nil { | ||||||
| 		if pin.VerifyPIN(string(AccountPin), string(input)) { | 		if pin.VerifyPIN(string(AccountPin), string(input)) { | ||||||
| 			if h.st.MatchFlag(flag_account_authorized, false) { | 			if h.st.MatchFlag(flag_account_authorized, false) { | ||||||
| 				res.FlagReset = append(res.FlagReset, flag_incorrect_pin) | 				res.FlagReset = append(res.FlagReset, flag_incorrect_pin) | ||||||
| @ -1235,7 +1250,7 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			err := h.incrementIncorrectPINAttempts(ctx, sessionId) | 			err = h.incrementIncorrectPINAttempts(ctx, sessionId) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return res, err | 				return res, err | ||||||
| 			} | 			} | ||||||
| @ -1252,11 +1267,13 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) | |||||||
| // Setback sets the flag_back_set flag when the navigation is back.
 | // Setback sets the flag_back_set flag when the navigation is back.
 | ||||||
| func (h *MenuHandlers) SetBack(ctx context.Context, sym string, input []byte) (resource.Result, error) { | func (h *MenuHandlers) SetBack(ctx context.Context, sym string, input []byte) (resource.Result, error) { | ||||||
| 	var res resource.Result | 	var res resource.Result | ||||||
|  | 	flag_back_set, _ := h.flagManager.GetFlag("flag_back_set") | ||||||
| 	//TODO:
 | 	//TODO:
 | ||||||
| 	//Add check if the navigation is lateral nav instead of checking the input.
 | 	//Add check if the navigation is lateral nav instead of checking the input.
 | ||||||
| 	if string(input) == "0" { | 	if string(input) == "0" { | ||||||
| 		flag_back_set, _ := h.flagManager.GetFlag("flag_back_set") |  | ||||||
| 		res.FlagSet = append(res.FlagSet, flag_back_set) | 		res.FlagSet = append(res.FlagSet, flag_back_set) | ||||||
|  | 	} else { | ||||||
|  | 		res.FlagReset = append(res.FlagReset, flag_back_set) | ||||||
| 	} | 	} | ||||||
| 	return res, nil | 	return res, nil | ||||||
| } | } | ||||||
|  | |||||||
| @ -177,20 +177,6 @@ func TestInit(t *testing.T) { | |||||||
| 			input:          []byte("1"), | 			input:          []byte("1"), | ||||||
| 			expectedResult: resource.Result{}, | 			expectedResult: resource.Result{}, | ||||||
| 		}, | 		}, | ||||||
| 		{ |  | ||||||
| 			name: "Move to top node on empty input", |  | ||||||
| 			setup: func() (*MenuHandlers, context.Context) { |  | ||||||
| 				pe := persist.NewPersister(testStore).WithSession(sessionId).WithContent(st, ca) |  | ||||||
| 				h := &MenuHandlers{ |  | ||||||
| 					flagManager: fm, |  | ||||||
| 					pe:          pe, |  | ||||||
| 				} |  | ||||||
| 				st.Code = []byte("some pending bytecode") |  | ||||||
| 				return h, context.WithValue(ctx, "SessionId", sessionId) |  | ||||||
| 			}, |  | ||||||
| 			input:          []byte(""), |  | ||||||
| 			expectedResult: resource.Result{}, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, tt := range tests { | 	for _, tt := range tests { | ||||||
| @ -1858,12 +1844,14 @@ func TestVerifyNewPin(t *testing.T) { | |||||||
| 	sessionId := "session123" | 	sessionId := "session123" | ||||||
| 
 | 
 | ||||||
| 	fm, _ := NewFlagManager(flagsPath) | 	fm, _ := NewFlagManager(flagsPath) | ||||||
|  | 	mockState := state.NewState(16) | ||||||
| 
 | 
 | ||||||
| 	flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") | 	flag_valid_pin, _ := fm.GetFlag("flag_valid_pin") | ||||||
| 	mockAccountService := new(mocks.MockAccountService) | 	mockAccountService := new(mocks.MockAccountService) | ||||||
| 	h := &MenuHandlers{ | 	h := &MenuHandlers{ | ||||||
| 		flagManager:    fm, | 		flagManager:    fm, | ||||||
| 		accountService: mockAccountService, | 		accountService: mockAccountService, | ||||||
|  | 		st:             mockState, | ||||||
| 	} | 	} | ||||||
| 	ctx := context.WithValue(context.Background(), "SessionId", sessionId) | 	ctx := context.WithValue(context.Background(), "SessionId", sessionId) | ||||||
| 
 | 
 | ||||||
| @ -1901,6 +1889,7 @@ func TestVerifyNewPin(t *testing.T) { | |||||||
| func TestConfirmPin(t *testing.T) { | func TestConfirmPin(t *testing.T) { | ||||||
| 	sessionId := "session123" | 	sessionId := "session123" | ||||||
| 
 | 
 | ||||||
|  | 	mockState := state.NewState(16) | ||||||
| 	ctx, store := InitializeTestStore(t) | 	ctx, store := InitializeTestStore(t) | ||||||
| 	ctx = context.WithValue(ctx, "SessionId", sessionId) | 	ctx = context.WithValue(ctx, "SessionId", sessionId) | ||||||
| 
 | 
 | ||||||
| @ -1911,6 +1900,7 @@ func TestConfirmPin(t *testing.T) { | |||||||
| 		userdataStore:  store, | 		userdataStore:  store, | ||||||
| 		flagManager:    fm, | 		flagManager:    fm, | ||||||
| 		accountService: mockAccountService, | 		accountService: mockAccountService, | ||||||
|  | 		st:             mockState, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	tests := []struct { | 	tests := []struct { | ||||||
|  | |||||||
| @ -8,11 +8,17 @@ import ( | |||||||
| 	"git.defalsify.org/vise.git/engine" | 	"git.defalsify.org/vise.git/engine" | ||||||
| 	"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/logging" | ||||||
| 
 | 
 | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-api/remote" | 	"git.grassecon.net/grassrootseconomics/sarafu-api/remote" | ||||||
|  | //	sarafu_engine "git.grassecon.net/grassrootseconomics/sarafu-vise/engine"
 | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var ( | ||||||
|  | 	logg = logging.NewVanilla().WithDomain("sarafu-vise.engine") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| type HandlerService interface { | type HandlerService interface { | ||||||
| 	GetHandler() (*application.MenuHandlers, error) | 	GetHandler() (*application.MenuHandlers, error) | ||||||
| } | } | ||||||
| @ -24,6 +30,7 @@ type LocalHandlerService struct { | |||||||
| 	UserdataStore *db.Db | 	UserdataStore *db.Db | ||||||
| 	Cfg           engine.Config | 	Cfg           engine.Config | ||||||
| 	Rs            resource.Resource | 	Rs            resource.Resource | ||||||
|  | 	first         resource.EntryFunc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewLocalHandlerService(ctx context.Context, fp string, debug bool, dbResource *resource.DbResource, cfg engine.Config, rs resource.Resource) (*LocalHandlerService, error) { | func NewLocalHandlerService(ctx context.Context, fp string, debug bool, dbResource *resource.DbResource, cfg engine.Config, rs resource.Resource) (*LocalHandlerService, error) { | ||||||
| @ -117,13 +124,19 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) | |||||||
| 	ls.DbRs.AddLocalFunc("update_all_profile_items", appHandlers.UpdateAllProfileItems) | 	ls.DbRs.AddLocalFunc("update_all_profile_items", appHandlers.UpdateAllProfileItems) | ||||||
| 	ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack) | 	ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack) | ||||||
| 	ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount) | 	ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount) | ||||||
|  | 	ls.first = appHandlers.Init | ||||||
| 
 | 
 | ||||||
| 	return appHandlers, nil | 	return appHandlers, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TODO: enable setting of sessionId on engine init time
 | func (ls *LocalHandlerService) GetEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine { | ||||||
| func (ls *LocalHandlerService) GetEngine() *engine.DefaultEngine { | 	en := engine.NewEngine(cfg, rs) | ||||||
| 	en := engine.NewEngine(ls.Cfg, ls.Rs) | 	if ls.first != nil { | ||||||
| 	en = en.WithPersister(ls.Pe) | 		en = en.WithFirst(ls.first) | ||||||
|  | 	} | ||||||
|  | 	en = en.WithPersister(pr) | ||||||
|  | 	if cfg.EngineDebug { | ||||||
|  | 		en = en.WithDebug(nil) | ||||||
|  | 	} | ||||||
| 	return en | 	return en | ||||||
| } | } | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ RELOAD save_others_temporary_pin | |||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT  | HALT  | ||||||
| INCMP _ 0 | INCMP _ 0 | ||||||
| LOAD check_pin_mismatch 0 | LOAD check_pin_mismatch 6 | ||||||
| RELOAD check_pin_mismatch | RELOAD check_pin_mismatch | ||||||
| CATCH others_pin_mismatch flag_pin_mismatch 1 | CATCH others_pin_mismatch flag_pin_mismatch 1 | ||||||
| INCMP pin_entry * | INCMP pin_entry * | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| CATCH invalid_pin flag_valid_pin 0 | LOAD confirm_pin_change 0 | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| INCMP _ 0 | INCMP _ 0 | ||||||
|  | RELOAD confirm_pin_change | ||||||
|  | CATCH pin_reset_mismatch  flag_pin_mismatch 1 | ||||||
| INCMP * pin_reset_success | INCMP * pin_reset_success | ||||||
|  | |||||||
| @ -4,4 +4,7 @@ RELOAD reset_account_authorized | |||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| INCMP _ 0 | INCMP _ 0 | ||||||
|  | LOAD validate_blocked_number 6 | ||||||
|  | RELOAD validate_blocked_number | ||||||
|  | CATCH unregistered_number flag_unregistered_number 1 | ||||||
| INCMP enter_others_new_pin * | INCMP enter_others_new_pin * | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| LOAD validate_blocked_number 6 |  | ||||||
| RELOAD validate_blocked_number |  | ||||||
| CATCH unregistered_number flag_unregistered_number 1 |  | ||||||
| LOAD retrieve_blocked_number 0 | LOAD retrieve_blocked_number 0 | ||||||
| RELOAD retrieve_blocked_number | RELOAD retrieve_blocked_number | ||||||
| MAP retrieve_blocked_number | MAP retrieve_blocked_number | ||||||
|  | |||||||
| @ -1,13 +1,7 @@ | |||||||
| LOAD authorize_account 12 |  | ||||||
| RELOAD authorize_account |  | ||||||
| CATCH incorrect_pin flag_incorrect_pin 1 |  | ||||||
| CATCH old_pin flag_allow_update 0 |  | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| INCMP _ 0 | INCMP _ 0 | ||||||
| LOAD save_temporary_pin 6 |  | ||||||
| LOAD verify_new_pin 0 |  | ||||||
| RELOAD save_temporary_pin | RELOAD save_temporary_pin | ||||||
| RELOAD verify_new_pin | RELOAD verify_new_pin | ||||||
|  | CATCH invalid_pin flag_valid_pin 0 | ||||||
| INCMP * confirm_pin_change | INCMP * confirm_pin_change | ||||||
| 
 |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| MOUT quit 9 | MOUT quit 9 | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| INCMP pin_management 0 | INCMP ^ 0 | ||||||
| INCMP quit 9 | INCMP quit 9 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| LOAD reset_allow_update 0 | RELOAD reset_incorrect | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| RELOAD reset_allow_update |  | ||||||
| INCMP _ 0 | INCMP _ 0 | ||||||
|  | RELOAD authorize_account | ||||||
|  | CATCH incorrect_pin flag_incorrect_pin 1 | ||||||
| INCMP new_pin * | INCMP new_pin * | ||||||
| 
 |  | ||||||
|  | |||||||
| @ -1,8 +1,15 @@ | |||||||
|  | LOAD confirm_pin_change 7 | ||||||
|  | LOAD set_back 6 | ||||||
|  | LOAD authorize_account 5 | ||||||
|  | LOAD reset_allow_update 4 | ||||||
|  | LOAD verify_new_pin 2 | ||||||
|  | LOAD save_temporary_pin 1 | ||||||
|  | LOAD reset_incorrect  0 | ||||||
| MOUT change_pin 1 | MOUT change_pin 1 | ||||||
| MOUT reset_pin 2 | MOUT reset_pin 2 | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| HALT | HALT | ||||||
| INCMP my_account 0 | INCMP _ 0 | ||||||
| INCMP old_pin  1 | INCMP old_pin  1 | ||||||
| INCMP enter_other_number 2 | INCMP enter_other_number 2 | ||||||
| INCMP . * | INCMP . * | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| MOUT retry 1 | MOUT retry 1 | ||||||
| MOUT quit 9 | MOUT quit 9 | ||||||
| HALT | HALT | ||||||
| INCMP confirm_pin_change 1 | INCMP _ 1 | ||||||
| INCMP quit 9 | INCMP quit 9 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,5 +4,5 @@ LOAD reset_others_pin 6 | |||||||
| MOUT back 0 | MOUT back 0 | ||||||
| MOUT quit 9 | MOUT quit 9 | ||||||
| HALT | HALT | ||||||
| INCMP pin_management 0 | INCMP ^ 0 | ||||||
| INCMP quit  9 | INCMP quit  9 | ||||||
|  | |||||||
| @ -1,6 +1,3 @@ | |||||||
| LOAD confirm_pin_change 0 |  | ||||||
| RELOAD confirm_pin_change |  | ||||||
| CATCH pin_reset_mismatch  flag_pin_mismatch 1 |  | ||||||
| MOUT back 0 | MOUT back 0 | ||||||
| MOUT quit 9 | MOUT quit 9 | ||||||
| HALT | HALT | ||||||
|  | |||||||
| @ -1,7 +1,8 @@ | |||||||
| LOAD reset_unregistered_number 0 | LOAD reset_unregistered_number 0 | ||||||
| RELOAD reset_unregistered_number | RELOAD reset_unregistered_number | ||||||
| MOUT back 0 | MOUT retry 1 | ||||||
| MOUT quit 9 | MOUT quit 9 | ||||||
| HALT | HALT | ||||||
| INCMP ^ 0 | INCMP _ 1 | ||||||
| INCMP quit 9 | INCMP quit 9 | ||||||
|  | INCMP . * | ||||||
|  | |||||||
							
								
								
									
										20
									
								
								ssh/ssh.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								ssh/ssh.go
									
									
									
									
									
								
							| @ -177,20 +177,14 @@ func (s *SshRunner) GetEngine(sessionId string) (engine.Engine, func(), error) { | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: clear up why pointer here and by-value other cmds
 |  | ||||||
| 	accountService := services.New(ctx, menuStorageService) |  | ||||||
| 
 |  | ||||||
| 	hl, err := lhs.GetHandler(accountService) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	en := lhs.GetEngine() |  | ||||||
| 	en = en.WithFirst(hl.Init) |  | ||||||
| 	if s.Debug { |  | ||||||
| 		en = en.WithDebug(nil) |  | ||||||
| 	} |  | ||||||
| 	// TODO: this is getting very hacky!
 | 	// TODO: this is getting very hacky!
 | ||||||
|  | 	accountService := services.New(ctx, menuStorageService) | ||||||
|  | 	_, err = lhs.GetHandler(accountService) | ||||||
|  | 	if err != nil { | ||||||
|  | 	       fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err) | ||||||
|  | 	       os.Exit(1) | ||||||
|  | 	} | ||||||
|  | 	en := lhs.GetEngine(lhs.Cfg, rs, pe) | ||||||
| 	closer := func() { | 	closer := func() { | ||||||
| 		err := menuStorageService.Close(ctx) | 		err := menuStorageService.Close(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | |||||||
| @ -137,14 +137,14 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { | |||||||
| 		panic("Unknown account service type") | 		panic("Unknown account service type") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	hl, err := lhs.GetHandler(testtag.AccountService) | 	// TODO: triggers withfirst assignment
 | ||||||
|  | 	_, err = lhs.GetHandler(testtag.AccountService) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		fmt.Fprintf(os.Stderr, err.Error()) | 		fmt.Fprintf(os.Stderr, err.Error()) | ||||||
| 		os.Exit(1) | 		os.Exit(1) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	en := lhs.GetEngine() | 	en := lhs.GetEngine(lhs.Cfg, rs, pe) | ||||||
| 	en = en.WithFirst(hl.Init) |  | ||||||
| 	cleanFn := func() { | 	cleanFn := func() { | ||||||
| 		err := en.Finish(ctx) | 		err := en.Finish(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user