Compare commits

...

53 Commits

Author SHA1 Message Date
lash
c243edd4c4 Make override constructor for args population 2025-01-21 14:25:55 +00:00
lash
592c57b72d Update deps, unique fsdbs in testfsdb 2025-01-21 14:14:52 +00:00
lash
341f0b9cc8 Merge branch 'master' into lash/dbtx 2025-01-21 13:45:33 +00:00
lash
1c911ee73f Merge branch 'master' into lash/dbtx 2025-01-21 13:44:56 +00:00
lash
00b9079a55 Clean up spaces 2025-01-21 13:44:32 +00:00
lash
156511e499 Build vise-asm binary in makefile 2025-01-21 08:17:23 +00:00
lash
8b68130ed4 Remove bin files 2025-01-21 08:11:26 +00:00
lash
7ab8eef623 Merge branch 'reset-account-blocked-flag' into lash/dbtx 2025-01-21 08:02:56 +00:00
7d513ac2a7 Merge pull request 'reset account blocked flag' (#13) from reset-account-blocked-flag into master
Reviewed-on: #13
2025-01-21 07:47:33 +01:00
alfred-mk
fbee26da08 added CheckBlockedStatus to reset the flag_account_blocked if the incorrect PIN attempt has been reset 2025-01-21 02:29:59 +03:00
alfred-mk
4fb3474b51 reset the incorrect PIN attempts to 0 when the PIN is reset 2025-01-21 02:28:19 +03:00
lash
b31011b390 Update deps 2025-01-20 12:37:02 +00:00
lash
358567e52e Merge remote-tracking branch 'origin/master' into lash/dbtx 2025-01-20 12:01:35 +00:00
9c05e0b4a2 Merge pull request 'Encrypt PIN in temporary value' (#12) from encrypt-pin into master
Reviewed-on: #12
2025-01-20 13:00:37 +01:00
57fb1d0ef3 Merge branch 'master' into encrypt-pin 2025-01-20 12:59:57 +01:00
alfred-mk
2dcec2e9fb update tests to match changes in menuhandler 2025-01-20 14:46:12 +03:00
alfred-mk
286a72f12e hash the PIN in temporary value and arrange functions 2025-01-20 14:44:53 +03:00
lash
933943636e Implement conns in testutil 2025-01-20 10:28:42 +00:00
Carlosokumu
4e584cea92 increase size limit to allow fqdn for the alias 2025-01-20 12:16:05 +03:00
lash
20feef4103 WIP integrate multiple conns, menutraversal now panics 2025-01-19 18:27:47 +00:00
lash
8d5d3f1dc8 WIP implement multi connstr config 2025-01-19 16:32:55 +00:00
lash
0f54ab4b4a Update deps, fix connbusy error in postgres get 2025-01-19 11:11:34 +00:00
lash
be47c999ca Integrate tx enabled vise db 2025-01-19 09:46:37 +00:00
lash
c719db8b92 Update dep 2025-01-18 19:35:48 +00:00
lash
16cb2846b7 Update govise dep; removes hardcoded datatype 2025-01-18 09:00:44 +00:00
lash
bc2abc2464 Update govise dep, dump keys fix 2025-01-18 08:23:40 +00:00
lash
9cb9e02442 Merge branch 'master' into lash/update-dump 2025-01-17 18:56:43 +00:00
lash
ab03e6d529 Rehabilitate debug db tets, improve dump format 2025-01-17 11:09:30 +00:00
lash
9b66146ef1 Remove generate tool (use devapi main instead) 2025-01-17 10:36:29 +00:00
lash
825c06c3bb Rehabilitate dump tool 2025-01-17 10:36:02 +00:00
71ff251d51 Merge pull request 'lash/admin-tool' (#8) from lash/admin-tool into master
Reviewed-on: #8
2025-01-17 10:02:04 +01:00
alfred-mk
4cc0de59a7 updated tests 2025-01-17 11:45:55 +03:00
alfred-mk
4b8505680b added logging 2025-01-17 11:45:27 +03:00
alfred-mk
104db94826 remove unused adminstore 2025-01-17 11:44:33 +03:00
alfred-mk
ecee5b4dee remove code that reset the admin flag based on the adminstore 2025-01-17 11:35:20 +03:00
lash
879baa03fc Use FlagManager instead of asm flagparser directly 2025-01-16 13:50:18 +00:00
lash
ecac4ae009 Merge branch 'master' into lash/admin-tool 2025-01-16 11:36:57 +00:00
lash
6b404f56c9 Factor out command parse and exec logic 2025-01-16 11:34:54 +00:00
ca7dc6779a Merge pull request 'Add contact information for help on the account pending page' (#7) from contact-info-on-pending-page into master
Reviewed-on: #7
2025-01-15 20:06:27 +01:00
alfred-mk
471bbea5ca Add contact information for help on the account pending page 2025-01-15 21:57:38 +03:00
lash
78fae3526b Fix flag count, remove session prefix from auth gdbm lookup 2025-01-15 13:40:33 +00:00
lash
e410158432 Add api selector for at 2025-01-15 08:06:28 +00:00
lash
ff06b92ffd Implement api selector for all runners 2025-01-15 07:58:01 +00:00
0a7152d6b8 Merge pull request 'Store initial language selection' (#3) from lash/initial-language into master
Reviewed-on: #3
2025-01-15 08:42:51 +01:00
lash
47da078244 Merge branch 'master' into lash/initial-language 2025-01-15 07:42:19 +00:00
acfb6c1d76 Merge pull request 'Hide dev api usage behind build tag' (#4) from lash/dev-api-buildtag into master
Reviewed-on: #4
2025-01-15 08:38:13 +01:00
lash
f8b38dd210 Upgrade deps 2025-01-15 07:26:34 +00:00
lash
ac492e8403 update deps 2025-01-15 00:41:04 +00:00
lash
ac00e4619e Toggle services with build tags, cmd now runs with dev api 2025-01-15 00:16:03 +00:00
lash
604f3103c7 Fix wrong key for initial language write, add test 2025-01-14 15:44:14 +00:00
lash
26b32a8b93 Introduce initial language code setting 2025-01-14 15:34:17 +00:00
lash
960a3d9075 Implement alias dev api 2025-01-14 14:27:28 +00:00
lash
55356a0c64 Remove userstore change with custodial event 2025-01-14 08:39:24 +00:00
124 changed files with 1226 additions and 1142 deletions

View File

@@ -22,9 +22,8 @@ import (
at "git.grassecon.net/grassrootseconomics/visedriver-africastalking/africastalking" at "git.grassecon.net/grassrootseconomics/visedriver-africastalking/africastalking"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args" "git.grassecon.net/grassrootseconomics/sarafu-vise/args"
httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
) )
var ( var (
@@ -37,8 +36,7 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string override := config.NewOverride()
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@@ -47,10 +45,11 @@ func main() {
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir")
flag.StringVar(&connStr, "c", "", "connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
flag.UintVar(&port, "p", config.Port(), "http port") flag.UintVar(&port, "p", config.Port(), "http port")
@@ -58,16 +57,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "build", build, "conn", connData, "resourcedir", resourceDir, "outputsize", size) logg.Infof("start command", "build", build, "conn", conns, "outputsize", size)
ctx := context.Background() ctx := context.Background()
ln, err := lang.LanguageFromCode(config.Language()) ln, err := lang.LanguageFromCode(config.Language())
@@ -90,7 +87,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx) rs, err := menuStorageService.GetResource(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err) fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err)
@@ -102,7 +99,6 @@ func main() {
fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err) fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err)
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close()
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@@ -121,7 +117,8 @@ func main() {
os.Exit(1) os.Exit(1)
} }
accountService := &httpremote.HTTPAccountService{} 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, "httpaccountservice: %v\n", err) fmt.Fprintf(os.Stderr, "httpaccountservice: %v\n", err)
@@ -133,7 +130,6 @@ func main() {
fmt.Fprintf(os.Stderr, "getstatestore: %v\n", err) fmt.Fprintf(os.Stderr, "getstatestore: %v\n", err)
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close()
rp := &at.ATRequestParser{} rp := &at.ATRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
@@ -146,7 +142,10 @@ func main() {
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: mux, Handler: mux,
} }
s.RegisterOnShutdown(sh.Shutdown) shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal) cint := make(chan os.Signal)
cterm := make(chan os.Signal) cterm := make(chan os.Signal)

View File

@@ -17,7 +17,7 @@ import (
"git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage" "git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/visedriver/request" "git.grassecon.net/grassrootseconomics/visedriver/request"
httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" "git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args" "git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
) )
@@ -44,9 +44,8 @@ func (p *asyncRequestParser) GetInput(r any) ([]byte, error) {
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string override := config.NewOverride()
var sessionId string var sessionId string
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@@ -56,8 +55,11 @@ func main() {
var langs args.LangVar var langs args.LangVar
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
@@ -66,16 +68,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size, "sessionId", sessionId) logg.Infof("start command", "conn", conns, "outputsize", size, "sessionId", sessionId)
ctx := context.Background() ctx := context.Background()
@@ -99,7 +99,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
@@ -116,7 +116,7 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close() //defer userdataStore.Close(ctx)
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@@ -125,7 +125,8 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore) lhs.SetDataStore(&userdataStore)
accountService := &httpremote.HTTPAccountService{}
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService) hl, err := lhs.GetHandler(accountService)
if err != nil { if err != nil {
@@ -138,7 +139,7 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close() //defer stateStore.Close(ctx)
rp := &asyncRequestParser{ rp := &asyncRequestParser{
sessionId: sessionId, sessionId: sessionId,
@@ -160,7 +161,7 @@ func main() {
case _ = <-cint: case _ = <-cint:
case _ = <-cterm: case _ = <-cterm:
} }
sh.Shutdown() sh.Shutdown(ctx)
}() }()
for true { for true {
@@ -176,7 +177,7 @@ func main() {
fmt.Errorf("error in output: %v", err) fmt.Errorf("error in output: %v", err)
os.Exit(1) os.Exit(1)
} }
rqs, err = sh.Reset(rqs) rqs, err = sh.Reset(ctx, rqs)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "error in reset: %v", "err", err) logg.ErrorCtxf(ctx, "error in reset: %v", "err", err)
fmt.Errorf("error in reset: %v", err) fmt.Errorf("error in reset: %v", err)

View File

@@ -21,7 +21,7 @@ import (
"git.grassecon.net/grassrootseconomics/visedriver/request" "git.grassecon.net/grassrootseconomics/visedriver/request"
"git.grassecon.net/grassrootseconomics/visedriver/storage" "git.grassecon.net/grassrootseconomics/visedriver/storage"
httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" "git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args" "git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
) )
@@ -35,8 +35,7 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string override := config.NewOverride()
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@@ -45,8 +44,11 @@ func main() {
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
@@ -55,16 +57,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size) logg.Infof("start command", "conn", conns, "outputsize", size)
ctx := context.Background() ctx := context.Background()
@@ -88,7 +88,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx) rs, err := menuStorageService.GetResource(ctx)
if err != nil { if err != nil {
@@ -101,7 +101,6 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close()
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@@ -116,7 +115,8 @@ func main() {
os.Exit(1) os.Exit(1)
} }
accountService := &httpremote.HTTPAccountService{} 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())
@@ -128,7 +128,8 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close()
//accountService := services.New(ctx, menuStorageService, connData)
rp := &httprequest.DefaultRequestParser{} rp := &httprequest.DefaultRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
@@ -137,7 +138,10 @@ func main() {
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: sh, Handler: sh,
} }
s.RegisterOnShutdown(sh.Shutdown) shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal) cint := make(chan os.Signal)
cterm := make(chan os.Signal) cterm := make(chan os.Signal)

View File

@@ -5,7 +5,9 @@ import (
"flag" "flag"
"fmt" "fmt"
"os" "os"
"os/signal"
"path" "path"
"syscall"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging" "git.defalsify.org/vise.git/logging"
@@ -13,13 +15,9 @@ import (
"git.defalsify.org/vise.git/lang" "git.defalsify.org/vise.git/lang"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage" "git.grassecon.net/grassrootseconomics/visedriver/storage"
httpremote "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" "git.grassecon.net/grassrootseconomics/sarafu-vise/services"
devremote "git.grassecon.net/grassrootseconomics/sarafu-api/dev"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args" "git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
) )
var ( var (
@@ -28,66 +26,36 @@ var (
menuSeparator = ": " menuSeparator = ": "
) )
type devEmitter struct {
h *apievent.EventsHandler
}
func (d *devEmitter) emit(ctx context.Context, msg apievent.Msg) error {
var err error
if msg.Typ == apievent.EventTokenTransferTag {
tx, ok := msg.Item.(devremote.Tx)
if !ok {
return fmt.Errorf("not a valid tx")
}
logg.InfoCtxf(ctx, "tx emit", "tx", tx)
ev := tx.ToTransferEvent()
err = d.h.Handle(ctx, apievent.EventTokenTransferTag, &ev)
} else if msg.Typ == apievent.EventRegistrationTag {
acc, ok := msg.Item.(devremote.Account)
if !ok {
return fmt.Errorf("not a valid tx")
}
logg.InfoCtxf(ctx, "account emit", "account", acc)
ev := acc.ToRegistrationEvent()
err = d.h.Handle(ctx, apievent.EventRegistrationTag, &ev)
}
return err
}
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var accountService remote.AccountService override := config.NewOverride()
var fakeDir string
var connStr string
var size uint var size uint
var sessionId string var sessionId string
var engineDebug bool var engineDebug bool
var resourceDir string
var err error var err error
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", scriptDir, "resource dir")
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&fakeDir, "fakedir", "", "if valid path, enables fake api with fsdb backend") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "outputsize", size) logg.Infof("start command", "conn", conns, "outputsize", size)
if len(langs.Langs()) == 0 { if len(langs.Langs()) == 0 {
langs.Set(config.Language()) langs.Set(config.Language())
@@ -113,7 +81,7 @@ func main() {
MenuSeparator: menuSeparator, MenuSeparator: menuSeparator,
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err) fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err)
os.Exit(1) os.Exit(1)
@@ -155,18 +123,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
if fakeDir != "" { accountService := services.New(ctx, menuStorageService)
svc := devremote.NewDevAccountService(ctx, fakeDir).WithAutoVoucher(ctx, "FOO", 42)
eu := event.NewEventsUpdater(svc, menuStorageService)
emitter := &devEmitter{
h: eu.ToEventsHandler(),
}
svc = svc.WithEmitter(emitter.emit)
svc.AddVoucher(ctx, "BAR")
accountService = svc
} else {
accountService = &httpremote.HTTPAccountService{}
}
hl, err := lhs.GetHandler(accountService) hl, 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)
@@ -179,6 +136,18 @@ func main() {
en = en.WithDebug(nil) en = en.WithDebug(nil)
} }
cint := make(chan os.Signal)
cterm := make(chan os.Signal)
signal.Notify(cint, os.Interrupt, syscall.SIGINT)
signal.Notify(cterm, os.Interrupt, syscall.SIGTERM)
go func() {
select {
case _ = <-cint:
case _ = <-cterm:
}
menuStorageService.Close(ctx)
}()
err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil) err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err) fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err)

View File

@@ -31,34 +31,31 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var authConnStr string var authConnStr string
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var stateDebug bool var stateDebug bool
var host string var host string
var port uint var port uint
flag.StringVar(&connStr, "c", "", "connection string") //flag.StringVar(&authConnStr, "authdb", "", "auth connection string")
flag.StringVar(&authConnStr, "authdb", "", "auth connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.HostSSH(), "socket host") flag.StringVar(&host, "h", config.HostSSH(), "socket host")
flag.UintVar(&port, "p", config.PortSSH(), "socket port") flag.UintVar(&port, "p", config.PortSSH(), "socket port")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
if authConnStr == "" {
authConnStr = connStr
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
authConnData, err := storage.ToConnData(authConnStr) authConnData, err := storage.ToConnData(authConnStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "auth connstr err: %v", err) fmt.Fprintf(os.Stderr, "auth connstr err: %v", err)
@@ -79,14 +76,14 @@ func main() {
logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!") logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!")
logg.WarnCtxf(ctx, "!!!!! (See ssh -L <...>)") logg.WarnCtxf(ctx, "!!!!! (See ssh -L <...>)")
logg.Infof("start command", "conn", connData, "authconn", authConnData, "resourcedir", resourceDir, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port) logg.Infof("start command", "conn", conns, "authconn", authConnData, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port)
pfp := path.Join(scriptDir, "pp.csv") pfp := path.Join(scriptDir, "pp.csv")
cfg := engine.Config{ cfg := engine.Config{
Root: "root", Root: "root",
OutputSize: uint32(size), OutputSize: uint32(size),
FlagCount: uint32(16), FlagCount: uint32(128),
} }
if stateDebug { if stateDebug {
cfg.StateDebug = true cfg.StateDebug = true
@@ -102,7 +99,7 @@ func main() {
} }
defer func() { defer func() {
logg.TraceCtxf(ctx, "shutdown auth key store reached") logg.TraceCtxf(ctx, "shutdown auth key store reached")
err = authKeyStore.Close() err = authKeyStore.Close(ctx)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "keystore close error", "err", err) logg.ErrorCtxf(ctx, "keystore close error", "err", err)
} }
@@ -117,8 +114,7 @@ func main() {
Cfg: cfg, Cfg: cfg,
Debug: engineDebug, Debug: engineDebug,
FlagFile: pfp, FlagFile: pfp,
Conn: connData, Conn: conns,
ResourceDir: resourceDir,
SrvKeyFile: sshKeyFile, SrvKeyFile: sshKeyFile,
Host: host, Host: host,
Port: port, Port: port,

View File

@@ -34,7 +34,7 @@ func main() {
fmt.Fprintf(os.Stderr, "%v\n", err) fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1) os.Exit(1)
} }
defer store.Close() defer store.Close(ctx)
err = store.AddFromFile(ctx, sshKeyFile, sessionId) err = store.AddFromFile(ctx, sshKeyFile, sessionId)
if err != nil { if err != nil {

31
config/args.go Normal file
View File

@@ -0,0 +1,31 @@
package config
import (
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
)
type Override struct {
DbConn *string
StateConn *string
ResourceConn *string
UserConn *string
}
func NewOverride() *Override {
var a string
var b string
var c string
var d string
o := &Override{
DbConn: &a,
StateConn: &b,
ResourceConn: &c,
UserConn: &d,
}
return o
}
func Apply(o *Override) error {
viseconfig.ApplyConn(o.DbConn, o.StateConn, o.ResourceConn, o.UserConn)
return nil
}

View File

@@ -6,8 +6,17 @@ import (
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config" apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
) )
func init() { var (
env.LoadEnvVariables() GetConns = viseconfig.GetConns
EnvPath string
)
func loadEnv() {
if EnvPath == "" {
env.LoadEnvVariables()
} else {
env.LoadEnvVariablesPath(EnvPath)
}
} }
const ( const (
@@ -17,8 +26,8 @@ const (
defaultHTTPPort uint = 7123 defaultHTTPPort uint = 7123
) )
func LoadConfig() error { func LoadConfig() error {
loadEnv()
err := viseconfig.LoadConfig() err := viseconfig.LoadConfig()
if err != nil { if err != nil {
return err return err
@@ -30,10 +39,6 @@ func LoadConfig() error {
return nil return nil
} }
func DbConn() string {
return viseconfig.DbConn
}
func Language() string { func Language() string {
return viseconfig.DefaultLanguage return viseconfig.DefaultLanguage
} }

View File

@@ -32,18 +32,10 @@ func (k KeyInfo) String() string {
func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) { func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o := KeyInfo{} o := KeyInfo{}
b := []byte(sessionId)
if len(k) <= len(b) {
return o, fmt.Errorf("storage key missing")
}
o.SessionId = sessionId o.SessionId = sessionId
o.Typ = uint8(k[0]) o.Typ = uint8(k[0])
k = k[1:] k = k[1:]
o.SessionId = string(k[:len(b)])
k = k[len(b):]
if o.Typ == visedb.DATATYPE_USERDATA { if o.Typ == visedb.DATATYPE_USERDATA {
if len(k) == 0 { if len(k) == 0 {
@@ -53,28 +45,18 @@ func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o.SubTyp = storedb.DataTyp(v) o.SubTyp = storedb.DataTyp(v)
o.Label = subTypToString(o.SubTyp) o.Label = subTypToString(o.SubTyp)
k = k[2:] k = k[2:]
if len(k) != 0 {
return o, fmt.Errorf("excess key information: %x", k)
}
} else { } else {
o.Label = typToString(o.Typ) o.Label = typToString(o.Typ)
k = k[2:]
} }
if len(k) != 0 {
return o, fmt.Errorf("excess key information")
}
return o, nil return o, nil
} }
func FromKey(k []byte) (KeyInfo, error) {
o := KeyInfo{}
if len(k) < 4 {
return o, fmt.Errorf("insufficient key length")
}
sessionIdBytes := k[1:len(k)-2]
return ToKeyInfo(k, string(sessionIdBytes))
}
func subTypToString(v storedb.DataTyp) string { func subTypToString(v storedb.DataTyp) string {
return dbTypStr[v + visedb.DATATYPE_USERDATA + 1] return dbTypStr[v + visedb.DATATYPE_USERDATA + 1]
} }

View File

@@ -29,6 +29,9 @@ func init() {
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_DECIMAL] = "active decimal" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_DECIMAL] = "active decimal"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_ADDRESS] = "active address" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_ADDRESS] = "active address"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_INCORRECT_PIN_ATTEMPTS] = "incorrect pin attempts"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_SELECTED_LANGUAGE_CODE] = "selected language"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_INITIAL_LANGUAGE_CODE] = "initial language"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_SYMBOLS] = "voucher symbols" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_SYMBOLS] = "voucher symbols"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_BALANCES] = "voucher balances" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_BALANCES] = "voucher balances"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_DECIMALS] = "voucher decimals" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_DECIMALS] = "voucher decimals"

View File

@@ -10,7 +10,6 @@ import (
func TestDebugDbSubKeyInfo(t *testing.T) { func TestDebugDbSubKeyInfo(t *testing.T) {
s := "foo" s := "foo"
b := []byte{0x20} b := []byte{0x20}
b = append(b, []byte(s)...)
b = append(b, []byte{0x00, 0x02}...) b = append(b, []byte{0x00, 0x02}...)
r, err := ToKeyInfo(b, s) r, err := ToKeyInfo(b, s)
if err != nil { if err != nil {
@@ -56,7 +55,6 @@ func TestDebugDbKeyInfo(t *testing.T) {
func TestDebugDbKeyInfoRestore(t *testing.T) { func TestDebugDbKeyInfoRestore(t *testing.T) {
s := "bar" s := "bar"
b := []byte{visedb.DATATYPE_USERDATA} b := []byte{visedb.DATATYPE_USERDATA}
b = append(b, []byte(s)...)
k := storedb.ToBytes(storedb.DATA_ACTIVE_SYM) k := storedb.ToBytes(storedb.DATA_ACTIVE_SYM)
b = append(b, k...) b = append(b, k...)

View File

@@ -1,7 +0,0 @@
{
"admins": [
{
"phonenumber" : "<replace with any admin number to test with >"
}
]
}

View File

@@ -1,47 +0,0 @@
package commands
import (
"context"
"encoding/json"
"os"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
)
var (
logg = logging.NewVanilla().WithDomain("adminstore")
)
type Admin struct {
PhoneNumber string `json:"phonenumber"`
}
type Config struct {
Admins []Admin `json:"admins"`
}
func Seed(ctx context.Context) error {
var config Config
adminstore, err := store.NewAdminStore(ctx, "../admin_numbers")
store := adminstore.FsStore
if err != nil {
return err
}
defer store.Close()
data, err := os.ReadFile("admin_numbers.json")
if err != nil {
return err
}
if err := json.Unmarshal(data, &config); err != nil {
return err
}
for _, admin := range config.Admins {
err := store.Put(ctx, []byte(admin.PhoneNumber), []byte("1"))
if err != nil {
logg.Printf(logging.LVL_DEBUG, "Failed to insert admin number", admin.PhoneNumber)
return err
}
}
return nil
}

View File

@@ -2,16 +2,73 @@ package main
import ( import (
"context" "context"
"log" "flag"
"fmt"
"os"
"path"
"git.grassecon.net/grassrootseconomics/sarafu-vise/devtools/admin/commands" "git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/internal/cmd"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
)
var (
logg = logging.NewVanilla().WithContextKey("SessionId")
scriptDir = path.Join("services", "registration")
) )
func main() { func main() {
ctx := context.Background() config.LoadConfig()
err := commands.Seed(ctx)
var sessionId string
var override config.Override
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.Parse()
config.Apply(&override)
conns, err := config.GetConns()
if err != nil { if err != nil {
log.Fatalf("Failed to initialize a list of admins with error %s", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1)
}
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
pfp := path.Join(scriptDir, "pp.csv")
flagParser, err := application.NewFlagManager(pfp)
if err != nil {
fmt.Fprintf(os.Stderr, "flagparser fail: %v\n", err)
os.Exit(1)
}
x := cmd.NewCmd(sessionId, flagParser)
err = x.Parse(flag.Args())
if err != nil {
fmt.Fprintf(os.Stderr, "cmd parse fail: %v\n", err)
os.Exit(1)
}
logg.Infof("start command", "conn", conns, "subcmd", x)
menuStorageService := storage.NewMenuStorageService(conns)
if err != nil {
fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err)
os.Exit(1)
}
err = x.Exec(ctx, menuStorageService)
if err != nil {
fmt.Fprintf(os.Stderr, "cmd exec error: %v\n", err)
os.Exit(1)
} }
} }

View File

@@ -19,55 +19,58 @@ var (
scriptDir = path.Join("services", "registration") scriptDir = path.Join("services", "registration")
) )
func formatItem(k []byte, v []byte) (string, error) { func formatItem(k []byte, v []byte, sessionId string) (string, error) {
o, err := debug.FromKey(k) o, err := debug.ToKeyInfo(k, sessionId)
if err != nil { if err != nil {
return "", err return "", err
} }
s := fmt.Sprintf("%vValue: %v\n\n", o, string(v)) s := fmt.Sprintf("%v\t%v\n", o.Label, string(v))
return s, nil return s, nil
} }
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var sessionId string var sessionId string
var database string var database string
var engineDebug bool var engineDebug bool
var err error var err error
var first bool
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", ".state", "connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.Parse() flag.Parse()
if connStr != "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData) logg.Infof("start command", "conn", conns)
ctx := context.Background() ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
ctx = context.WithValue(ctx, "Database", database) ctx = context.WithValue(ctx, "Database", database)
resourceDir := scriptDir menuStorageService := storage.NewMenuStorageService(conns)
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
store, err := menuStorageService.GetUserdataDb(ctx) store, err := menuStorageService.GetUserdataDb(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "get userdata db: %v\n", err.Error()) fmt.Fprintf(os.Stderr, "get userdata db: %v\n", err.Error())
os.Exit(1) os.Exit(1)
} }
store.SetSession(sessionId)
store.SetPrefix(db.DATATYPE_USERDATA) store.SetPrefix(db.DATATYPE_USERDATA)
d, err := store.Dump(ctx, []byte(sessionId)) d, err := store.Dump(ctx, []byte(""))
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "store dump fail: %v\n", err.Error()) fmt.Fprintf(os.Stderr, "store dump fail: %v\n", err.Error())
os.Exit(1) os.Exit(1)
@@ -78,15 +81,19 @@ func main() {
if k == nil { if k == nil {
break break
} }
r, err := formatItem(k, v) if !first {
fmt.Printf("Session ID: %s\n---\n", sessionId)
first = true
}
r, err := formatItem(append([]byte{db.DATATYPE_USERDATA}, k...), v, sessionId)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "format db item error: %v", err) fmt.Fprintf(os.Stderr, "format db item error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
fmt.Printf(r) fmt.Printf(r)
} }
err = store.Close() err = store.Close(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)

View File

@@ -1,86 +0,0 @@
package main
import (
"context"
"crypto/sha1"
"flag"
"fmt"
"os"
"path"
testdataloader "github.com/peteole/testdata-loader"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
logg = logging.NewVanilla()
baseDir = testdataloader.GetBasePath()
scriptDir = path.Join("services", "registration")
)
func main() {
config.LoadConfig()
var connStr string
var sessionId string
var database string
var engineDebug bool
var err error
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", "", "connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.Parse()
if connStr != "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
os.Exit(1)
}
logg.Infof("start command", "conn", connData)
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
ctx = context.WithValue(ctx, "Database", database)
resourceDir := scriptDir
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
userDb, err := menuStorageService.GetUserdataDb(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
userStore := store.UserDataStore{userDb}
h := sha1.New()
h.Write([]byte(sessionId))
address := h.Sum(nil)
addressString := fmt.Sprintf("%x", address)
err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(addressString))
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
err = userStore.WriteEntry(ctx, addressString, storedb.DATA_PUBLIC_KEY_REVERSE, []byte(sessionId))
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
err = userDb.Close()
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
}

10
go.mod
View File

@@ -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.20250103172917-3e190a44568d git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250113213645-7c697394b5e7 git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84
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

20
go.sum
View File

@@ -1,13 +1,13 @@
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d h1:bPAOVZOX4frSGhfOdcj7kc555f8dc9DmMd2YAyC2AMw= git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 h1:sPcqXQcywxA8W3W+9qQncLPmsrgqTIlec7vmD4/7vyA=
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05 h1:BenzGx6aDHKDwE23/mWIFD2InYIXyzHroZWV3MF5WUk= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05/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-20250113213645-7c697394b5e7 h1:P+Bi5jcQbnCrLnKNC5k8XDTBsocyZTVifqDyZY6d0w8= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 h1:deGnqf4YCsbxhXgjFEjYjTUCvciLEmI26T9IysRsQXY=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250113213645-7c697394b5e7/go.mod h1:X9aQF93xw3vcW2QftJfzLewvbotRM0U00DRtdmFw294= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805/go.mod h1:9bc3d//Qqm11hz7GYRdQc1Uan+0GJIOpvRBbv8cHMu8=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b h1:6SieNUSEKbkjzquuwazs/lVG56zdEWF10zQQEMRJfMs= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162 h1:NaPbgGQ1Nb+yYF+Qj1LSagpjYeDcSXST8iZwONg4afY=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b/go.mod h1:E6W7ZOa7ZvVr0Bc5ot0LNSwpSPYq4hXlAIvEPy3AJ7U= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d h1:q/NO1rEgK3pia32D/tCq5hXfEuJp84COZRwceFvy/MM= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d/go.mod h1:AH15xABcvaJr1TCGlih3oGSuwWC0E5IdbHQwuu+E1KI= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/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=

File diff suppressed because it is too large Load Diff

View File

@@ -14,11 +14,11 @@ import (
"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"
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
"git.grassecon.net/grassrootseconomics/sarafu-api/testutil/testservice"
"git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
"git.grassecon.net/grassrootseconomics/common/pin" "git.grassecon.net/grassrootseconomics/common/pin"
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
"git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-api/testutil/testservice"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"github.com/alecthomas/assert/v2" "github.com/alecthomas/assert/v2"
@@ -54,7 +54,7 @@ func InitializeTestStore(t *testing.T) (context.Context, *store.UserDataStore) {
store := &store.UserDataStore{Db: db} store := &store.UserDataStore{Db: db}
t.Cleanup(func() { t.Cleanup(func() {
db.Close() // Ensure the DB is closed after each test db.Close(ctx) // Ensure the DB is closed after each test
}) })
return ctx, store return ctx, store
@@ -84,7 +84,7 @@ func TestNewMenuHandlers(t *testing.T) {
// Test case for valid UserDataStore // Test case for valid UserDataStore
t.Run("Valid UserDataStore", func(t *testing.T) { t.Run("Valid UserDataStore", func(t *testing.T) {
handlers, err := NewMenuHandlers(fm.parser, store, nil, &accountService, mockReplaceSeparator) handlers, err := NewMenuHandlers(fm, store, &accountService, mockReplaceSeparator)
if err != nil { if err != nil {
t.Fatalf("expected no error, got %v", err) t.Fatalf("expected no error, got %v", err)
} }
@@ -108,7 +108,7 @@ func TestNewMenuHandlers(t *testing.T) {
// Test case for nil UserDataStore // Test case for nil UserDataStore
t.Run("Nil UserDataStore", func(t *testing.T) { t.Run("Nil UserDataStore", func(t *testing.T) {
handlers, err := NewMenuHandlers(fm.parser, nil, nil, &accountService, mockReplaceSeparator) handlers, err := NewMenuHandlers(fm, nil, &accountService, mockReplaceSeparator)
if err == nil { if err == nil {
t.Fatal("expected an error, got none") t.Fatal("expected an error, got none")
} }
@@ -132,16 +132,9 @@ func TestInit(t *testing.T) {
t.Fatal(err.Error()) t.Fatal(err.Error())
} }
adminstore, err := store.NewAdminStore(ctx, "admin_numbers")
if err != nil {
t.Fatal(err.Error())
}
st := state.NewState(128) st := state.NewState(128)
ca := cache.NewCache() ca := cache.NewCache()
flag_admin_privilege, _ := fm.GetFlag("flag_admin_privilege")
tests := []struct { tests := []struct {
name string name string
setup func() (*MenuHandlers, context.Context) setup func() (*MenuHandlers, context.Context)
@@ -161,49 +154,40 @@ func TestInit(t *testing.T) {
setup: func() (*MenuHandlers, context.Context) { setup: func() (*MenuHandlers, context.Context) {
pe := persist.NewPersister(testStore).WithSession(sessionId).WithContent(st, ca) pe := persist.NewPersister(testStore).WithSession(sessionId).WithContent(st, ca)
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
adminstore: adminstore,
pe: pe, pe: pe,
} }
return h, context.WithValue(ctx, "SessionId", sessionId) return h, context.WithValue(ctx, "SessionId", sessionId)
}, },
input: []byte("1"), input: []byte("1"),
expectedResult: resource.Result{ expectedResult: resource.Result{},
FlagReset: []uint32{flag_admin_privilege},
},
}, },
{ {
name: "Non-admin session initialization", name: "Non-admin session initialization",
setup: func() (*MenuHandlers, context.Context) { setup: func() (*MenuHandlers, context.Context) {
pe := persist.NewPersister(testStore).WithSession("0712345678").WithContent(st, ca) pe := persist.NewPersister(testStore).WithSession("0712345678").WithContent(st, ca)
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
adminstore: adminstore,
pe: pe, pe: pe,
} }
return h, context.WithValue(context.Background(), "SessionId", "0712345678") return h, context.WithValue(context.Background(), "SessionId", "0712345678")
}, },
input: []byte("1"), input: []byte("1"),
expectedResult: resource.Result{ expectedResult: resource.Result{},
FlagReset: []uint32{flag_admin_privilege},
},
}, },
{ {
name: "Move to top node on empty input", name: "Move to top node on empty input",
setup: func() (*MenuHandlers, context.Context) { setup: func() (*MenuHandlers, context.Context) {
pe := persist.NewPersister(testStore).WithSession(sessionId).WithContent(st, ca) pe := persist.NewPersister(testStore).WithSession(sessionId).WithContent(st, ca)
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
adminstore: adminstore,
pe: pe, pe: pe,
} }
st.Code = []byte("some pending bytecode") st.Code = []byte("some pending bytecode")
return h, context.WithValue(ctx, "SessionId", sessionId) return h, context.WithValue(ctx, "SessionId", sessionId)
}, },
input: []byte(""), input: []byte(""),
expectedResult: resource.Result{ expectedResult: resource.Result{},
FlagReset: []uint32{flag_admin_privilege},
},
}, },
} }
@@ -256,7 +240,7 @@ func TestCreateAccount(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
mockAccountService.On("CreateAccount").Return(tt.serverResponse, nil) mockAccountService.On("CreateAccount").Return(tt.serverResponse, nil)
@@ -320,7 +304,7 @@ func TestSaveFirstname(t *testing.T) {
// Create the MenuHandlers instance with the mock store // Create the MenuHandlers instance with the mock store
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -365,7 +349,7 @@ func TestSaveFamilyname(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
st: mockState, st: mockState,
flagManager: fm.parser, flagManager: fm,
} }
// Call the method // Call the method
@@ -408,7 +392,7 @@ func TestSaveYoB(t *testing.T) {
// Create the MenuHandlers instance with the mock store // Create the MenuHandlers instance with the mock store
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -452,7 +436,7 @@ func TestSaveLocation(t *testing.T) {
// Create the MenuHandlers instance with the mock store // Create the MenuHandlers instance with the mock store
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -496,7 +480,7 @@ func TestSaveOfferings(t *testing.T) {
// Create the MenuHandlers instance with the mock store // Create the MenuHandlers instance with the mock store
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -564,7 +548,7 @@ func TestSaveGender(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
st: mockState, st: mockState,
flagManager: fm.parser, flagManager: fm,
} }
expectedResult := resource.Result{} expectedResult := resource.Result{}
@@ -595,11 +579,11 @@ func TestSaveTemporaryPin(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
flag_incorrect_pin, _ := fm.parser.GetFlag("flag_incorrect_pin") flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin")
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
userdataStore: store, userdataStore: store,
} }
@@ -812,7 +796,7 @@ func TestSetLanguage(t *testing.T) {
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
userdataStore: store, userdataStore: store,
st: mockState, st: mockState,
} }
@@ -825,6 +809,17 @@ func TestSetLanguage(t *testing.T) {
// Assert that the Result FlagSet has the required flags after language switch // Assert that the Result FlagSet has the required flags after language switch
assert.Equal(t, res, tt.expectedResult, "Result should match expected result") assert.Equal(t, res, tt.expectedResult, "Result should match expected result")
code, err := store.ReadEntry(ctx, sessionId, storedb.DATA_SELECTED_LANGUAGE_CODE)
if err != nil {
t.Error(err)
}
assert.Equal(t, string(code), tt.expectedResult.Content)
code, err = store.ReadEntry(ctx, sessionId, storedb.DATA_INITIAL_LANGUAGE_CODE)
if err != nil {
t.Error(err)
}
assert.Equal(t, string(code), "eng")
}) })
} }
} }
@@ -835,7 +830,7 @@ func TestResetAllowUpdate(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
flag_allow_update, _ := fm.parser.GetFlag("flag_allow_update") flag_allow_update, _ := fm.GetFlag("flag_allow_update")
// Define test cases // Define test cases
tests := []struct { tests := []struct {
@@ -856,7 +851,7 @@ func TestResetAllowUpdate(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
} }
// Call the method // Call the method
@@ -877,7 +872,7 @@ func TestResetAccountAuthorized(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
flag_account_authorized, _ := fm.parser.GetFlag("flag_account_authorized") flag_account_authorized, _ := fm.GetFlag("flag_account_authorized")
// Define test cases // Define test cases
tests := []struct { tests := []struct {
@@ -898,7 +893,7 @@ func TestResetAccountAuthorized(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
} }
// Call the method // Call the method
@@ -922,8 +917,8 @@ func TestIncorrectPinReset(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
flag_incorrect_pin, _ := fm.parser.GetFlag("flag_incorrect_pin") flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin")
flag_account_blocked, _ := fm.parser.GetFlag("flag_account_blocked") flag_account_blocked, _ := fm.GetFlag("flag_account_blocked")
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
@@ -981,7 +976,7 @@ func TestIncorrectPinReset(t *testing.T) {
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
userdataStore: store, userdataStore: store,
} }
@@ -1003,7 +998,7 @@ func TestResetIncorrectYob(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
flag_incorrect_date_format, _ := fm.parser.GetFlag("flag_incorrect_date_format") flag_incorrect_date_format, _ := fm.GetFlag("flag_incorrect_date_format")
// Define test cases // Define test cases
tests := []struct { tests := []struct {
@@ -1024,7 +1019,7 @@ func TestResetIncorrectYob(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
// Create the MenuHandlers instance with the mock flag manager // Create the MenuHandlers instance with the mock flag manager
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
} }
// Call the method // Call the method
@@ -1062,7 +1057,7 @@ func TestAuthorize(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -1130,12 +1125,12 @@ func TestVerifyYob(t *testing.T) {
// Create required mocks // Create required mocks
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
mockState := state.NewState(16) mockState := state.NewState(16)
flag_incorrect_date_format, _ := fm.parser.GetFlag("flag_incorrect_date_format") flag_incorrect_date_format, _ := fm.GetFlag("flag_incorrect_date_format")
ctx := context.WithValue(context.Background(), "SessionId", sessionId) ctx := context.WithValue(context.Background(), "SessionId", sessionId)
h := &MenuHandlers{ h := &MenuHandlers{
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -1195,14 +1190,14 @@ func TestVerifyCreatePin(t *testing.T) {
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
mockState := state.NewState(16) mockState := state.NewState(16)
flag_valid_pin, _ := fm.parser.GetFlag("flag_valid_pin") flag_valid_pin, _ := fm.GetFlag("flag_valid_pin")
flag_pin_mismatch, _ := fm.parser.GetFlag("flag_pin_mismatch") flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch")
flag_pin_set, _ := fm.parser.GetFlag("flag_pin_set") flag_pin_set, _ := fm.GetFlag("flag_pin_set")
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
st: mockState, st: mockState,
} }
@@ -1228,13 +1223,20 @@ func TestVerifyCreatePin(t *testing.T) {
}, },
} }
// Hash the correct PIN
hashedPIN, err := pin.HashPIN("1234")
if err != nil {
logg.ErrorCtxf(ctx, "failed to hash temporaryPin", "error", err)
t.Fatal(err)
}
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN))
if err != nil {
t.Fatal(err)
}
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte("1234"))
if err != nil {
t.Fatal(err)
}
// Call the method under test // Call the method under test
res, err := h.VerifyCreatePin(ctx, "verify_create_pin", []byte(tt.input)) res, err := h.VerifyCreatePin(ctx, "verify_create_pin", []byte(tt.input))
@@ -1296,7 +1298,7 @@ func TestCheckAccountStatus(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(tt.publicKey)) err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(tt.publicKey))
@@ -1336,7 +1338,7 @@ func TestTransactionReset(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
tests := []struct { tests := []struct {
name string name string
@@ -1376,14 +1378,14 @@ func TestResetTransactionAmount(t *testing.T) {
t.Logf(err.Error()) t.Logf(err.Error())
} }
flag_invalid_amount, _ := fm.parser.GetFlag("flag_invalid_amount") flag_invalid_amount, _ := fm.GetFlag("flag_invalid_amount")
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
tests := []struct { tests := []struct {
@@ -1420,14 +1422,14 @@ func TestInitiateTransaction(t *testing.T) {
if err != nil { if err != nil {
t.Logf(err.Error()) t.Logf(err.Error())
} }
account_authorized_flag, _ := fm.parser.GetFlag("flag_account_authorized") account_authorized_flag, _ := fm.GetFlag("flag_account_authorized")
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
tests := []struct { tests := []struct {
@@ -1513,7 +1515,7 @@ func TestQuit(t *testing.T) {
if err != nil { if err != nil {
t.Logf(err.Error()) t.Logf(err.Error())
} }
flag_account_authorized, _ := fm.parser.GetFlag("flag_account_authorized") flag_account_authorized, _ := fm.GetFlag("flag_account_authorized")
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
@@ -1523,7 +1525,7 @@ func TestQuit(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
tests := []struct { tests := []struct {
name string name string
@@ -1566,14 +1568,14 @@ func TestValidateAmount(t *testing.T) {
ctx, store := InitializeTestStore(t) ctx, store := InitializeTestStore(t)
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
flag_invalid_amount, _ := fm.parser.GetFlag("flag_invalid_amount") flag_invalid_amount, _ := fm.GetFlag("flag_invalid_amount")
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
tests := []struct { tests := []struct {
name string name string
@@ -1640,8 +1642,8 @@ func TestValidateRecipient(t *testing.T) {
ctx, store := InitializeTestStore(t) ctx, store := InitializeTestStore(t)
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
flag_invalid_recipient, _ := fm.parser.GetFlag("flag_invalid_recipient") flag_invalid_recipient, _ := fm.GetFlag("flag_invalid_recipient")
flag_invalid_recipient_with_invite, _ := fm.parser.GetFlag("flag_invalid_recipient_with_invite") flag_invalid_recipient_with_invite, _ := fm.GetFlag("flag_invalid_recipient_with_invite")
// Define test cases // Define test cases
tests := []struct { tests := []struct {
@@ -1693,12 +1695,12 @@ func TestValidateRecipient(t *testing.T) {
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
// Create the MenuHandlers instance // Create the MenuHandlers instance
h := &MenuHandlers{ h := &MenuHandlers{
flagManager: fm.parser, flagManager: fm,
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
} }
aliasResponse := &dataserviceapi.AliasAddress{ aliasResponse := &models.AliasAddress{
Address: "0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9", Address: "0xd4c288865Ce0985a481Eef3be02443dF5E2e4Ea9",
} }
@@ -1856,10 +1858,10 @@ func TestVerifyNewPin(t *testing.T) {
fm, _ := NewFlagManager(flagsPath) fm, _ := NewFlagManager(flagsPath)
flag_valid_pin, _ := fm.parser.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.parser, flagManager: fm,
accountService: mockAccountService, accountService: mockAccountService,
} }
ctx := context.WithValue(context.Background(), "SessionId", sessionId) ctx := context.WithValue(context.Background(), "SessionId", sessionId)
@@ -1902,24 +1904,24 @@ func TestConfirmPin(t *testing.T) {
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
fm, _ := NewFlagManager(flagsPath) fm, _ := NewFlagManager(flagsPath)
flag_pin_mismatch, _ := fm.parser.GetFlag("flag_pin_mismatch") flag_pin_mismatch, _ := fm.GetFlag("flag_pin_mismatch")
mockAccountService := new(mocks.MockAccountService) mockAccountService := new(mocks.MockAccountService)
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
accountService: mockAccountService, accountService: mockAccountService,
} }
tests := []struct { tests := []struct {
name string name string
input []byte input []byte
temporarypin []byte temporarypin string
expectedResult resource.Result expectedResult resource.Result
}{ }{
{ {
name: "Test with correct pin confirmation", name: "Test with correct pin confirmation",
input: []byte("1234"), input: []byte("1234"),
temporarypin: []byte("1234"), temporarypin: "1234",
expectedResult: resource.Result{ expectedResult: resource.Result{
FlagReset: []uint32{flag_pin_mismatch}, FlagReset: []uint32{flag_pin_mismatch},
}, },
@@ -1927,14 +1929,21 @@ func TestConfirmPin(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
// Hash the PIN
hashedPIN, err := pin.HashPIN(tt.temporarypin)
if err != nil {
logg.ErrorCtxf(ctx, "failed to hash temporaryPin", "error", err)
t.Fatal(err)
}
// Set up the expected behavior of the mock // Set up the expected behavior of the mock
err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(tt.temporarypin)) err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN))
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
//Call the function under test //Call the function under test
res, _ := h.ConfirmPinChange(ctx, "confirm_pin_change", tt.temporarypin) res, _ := h.ConfirmPinChange(ctx, "confirm_pin_change", tt.input)
//Assert that the result set to content is what was expected //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") assert.Equal(t, res, tt.expectedResult, "Result should contain flags set according to user input")
@@ -2036,7 +2045,7 @@ func TestSetDefaultVoucher(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
accountService: mockAccountService, accountService: mockAccountService,
flagManager: fm.parser, flagManager: fm,
} }
err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) err := store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey))
@@ -2144,7 +2153,7 @@ func TestViewVoucher(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
prefixDb: spdb, prefixDb: spdb,
} }
@@ -2217,7 +2226,7 @@ func TestGetVoucherDetails(t *testing.T) {
h := &MenuHandlers{ h := &MenuHandlers{
userdataStore: store, userdataStore: store,
flagManager: fm.parser, flagManager: fm,
accountService: mockAccountService, accountService: mockAccountService,
} }
err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte(tokA_AAddress)) err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte(tokA_AAddress))

View File

@@ -27,7 +27,7 @@ func (eh *EventsUpdater) handleCustodialRegistration(ctx context.Context, ev any
} }
func (eu *EventsUpdater) HandleCustodialRegistration(ctx context.Context, ev *apievent.EventCustodialRegistration) error { func (eu *EventsUpdater) HandleCustodialRegistration(ctx context.Context, ev *apievent.EventCustodialRegistration) error {
pe, userStore, err := eu.getStore(ctx) _, userStore, err := eu.getStore(ctx)
if err != nil { if err != nil {
return err return err
} }
@@ -35,11 +35,13 @@ func (eu *EventsUpdater) HandleCustodialRegistration(ctx context.Context, ev *ap
if err != nil { if err != nil {
return err return err
} }
err = pe.Load(identity.SessionId) // err = pe.Load(identity.SessionId)
if err != nil { // if err != nil {
return err // return err
} // }
st := pe.GetState() // st := pe.GetState()
st.SetFlag(accountCreatedFlag) // st.SetFlag(accountCreatedFlag)
return pe.Save(identity.SessionId) // return pe.Save(identity.SessionId)
logg.DebugCtxf(ctx, "received custodial registration event", "identity", identity)
return nil
} }

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"strings" "strings"
"git.defalsify.org/vise.git/asm"
"git.defalsify.org/vise.git/db" "git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
@@ -12,47 +11,35 @@ import (
"git.grassecon.net/grassrootseconomics/sarafu-api/remote" "git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
) )
type HandlerService interface { type HandlerService interface {
GetHandler() (*application.MenuHandlers, error) GetHandler() (*application.MenuHandlers, error)
} }
func getParser(fp string, debug bool) (*asm.FlagParser, error) {
flagParser := asm.NewFlagParser().WithDebug()
_, err := flagParser.Load(fp)
if err != nil {
return nil, err
}
return flagParser, nil
}
type LocalHandlerService struct { type LocalHandlerService struct {
Parser *asm.FlagParser Parser *application.FlagManager
DbRs *resource.DbResource DbRs *resource.DbResource
Pe *persist.Persister Pe *persist.Persister
UserdataStore *db.Db UserdataStore *db.Db
AdminStore *store.AdminStore
Cfg engine.Config Cfg engine.Config
Rs resource.Resource Rs resource.Resource
} }
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) {
parser, err := getParser(fp, debug) parser, err := application.NewFlagManager(fp)
if err != nil { if err != nil {
return nil, err return nil, err
} }
adminstore, err := store.NewAdminStore(ctx, "admin_numbers") if debug {
if err != nil { parser.SetDebug()
return nil, err
} }
return &LocalHandlerService{ return &LocalHandlerService{
Parser: parser, Parser: parser,
DbRs: dbResource, DbRs: dbResource,
AdminStore: adminstore, Cfg: cfg,
Cfg: cfg, Rs: rs,
Rs: rs,
}, nil }, nil
} }
@@ -69,12 +56,13 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator) return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator)
} }
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, ls.AdminStore, accountService, replaceSeparatorFunc) appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, accountService, replaceSeparatorFunc)
if err != nil { if err != nil {
return nil, err return nil, err
} }
//appHandlers = appHandlers.WithPersister(ls.Pe) //appHandlers = appHandlers.WithPersister(ls.Pe)
appHandlers.SetPersister(ls.Pe) appHandlers.SetPersister(ls.Pe)
ls.DbRs.AddLocalFunc("check_blocked_status", appHandlers.CheckBlockedStatus)
ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage) ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage)
ls.DbRs.AddLocalFunc("create_account", appHandlers.CreateAccount) ls.DbRs.AddLocalFunc("create_account", appHandlers.CreateAccount)
ls.DbRs.AddLocalFunc("save_temporary_pin", appHandlers.SaveTemporaryPin) ls.DbRs.AddLocalFunc("save_temporary_pin", appHandlers.SaveTemporaryPin)

98
internal/cmd/cmd.go Normal file
View File

@@ -0,0 +1,98 @@
package cmd
import (
"context"
"fmt"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
)
var (
logg = logging.NewVanilla().WithDomain("cmd").WithContextKey("SessionId")
)
type Cmd struct {
sessionId string
conn storage.ConnData
flagParser *application.FlagManager
cmd int
enable bool
exec func(ctx context.Context, ss storage.StorageService) error
}
func NewCmd(sessionId string, flagParser *application.FlagManager) *Cmd {
return &Cmd{
sessionId: sessionId,
flagParser: flagParser,
}
}
func (c *Cmd) Exec(ctx context.Context, ss storage.StorageService) error {
return c.exec(ctx, ss)
}
func (c *Cmd) execAdmin(ctx context.Context, ss storage.StorageService) error {
pe, err := ss.GetPersister(ctx)
if err != nil {
return err
}
err = pe.Load(c.sessionId)
if err != nil {
return err
}
defer func() {
err := pe.Save(c.sessionId)
if err != nil {
logg.ErrorCtxf(ctx, "failed persister save: %v", err)
}
}()
st := pe.GetState()
flag, err := c.flagParser.GetFlag("flag_admin_privilege")
if err != nil {
return err
}
if c.enable {
logg.InfoCtxf(ctx, "setting admin flag", "flag", flag)
st.SetFlag(flag)
} else {
st.ResetFlag(flag)
}
return nil
}
func (c *Cmd) parseCmdAdmin(cmd string, param string, more []string) (bool, error) {
if cmd == "admin" {
if param == "1" {
c.enable = true
} else if param != "0" {
return false, fmt.Errorf("invalid parameter: %v", param)
}
c.exec = c.execAdmin
return true, nil
}
return false, nil
}
func (c *Cmd) Parse(args []string) error {
if len(args) < 2 {
return fmt.Errorf("Wrong number of arguments: %v", args)
}
cmd := args[0]
param := args[1]
args = args[2:]
r, err := c.parseCmdAdmin(cmd, param, args)
if err != nil {
return err
}
if r {
return nil
}
return fmt.Errorf("unknown subcommand: %s", cmd)
}

View File

@@ -10,11 +10,13 @@ import (
"testing" "testing"
"github.com/gofrs/uuid" "github.com/gofrs/uuid"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/driver" "git.grassecon.net/grassrootseconomics/visedriver/testutil/driver"
"git.grassecon.net/grassrootseconomics/sarafu-vise/testutil" "git.grassecon.net/grassrootseconomics/sarafu-vise/testutil"
) )
var ( var (
logg = logging.NewVanilla().WithDomain("menutraversaltest")
testData = driver.ReadData() testData = driver.ReadData()
sessionID string sessionID string
src = rand.NewSource(42) src = rand.NewSource(42)
@@ -22,9 +24,6 @@ var (
) )
var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests") var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests")
var database = flag.String("db", "gdbm", "Specify the database (gdbm or postgres)")
var connStr = flag.String("conn", ".test_state", "connection string")
var dbSchema = flag.String("schema", "test", "Specify the database schema (default test)")
func GenerateSessionId() string { func GenerateSessionId() string {
uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g)) uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g))
@@ -80,12 +79,7 @@ func extractSendAmount(response []byte) string {
} }
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
// Parse the flags
flag.Parse()
sessionID = GenerateSessionId() sessionID = GenerateSessionId()
// set the db
testutil.SetDatabase(*database, *connStr, *dbSchema)
// Cleanup the db after tests // Cleanup the db after tests
defer testutil.CleanDatabase() defer testutil.CleanDatabase()
@@ -100,7 +94,8 @@ func TestAccountCreationSuccessful(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful") groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@@ -142,7 +137,8 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_reject_terms") groups := driver.FilterGroupsByName(session.Groups, "account_creation_reject_terms")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@@ -177,7 +173,8 @@ func TestMainMenuHelp(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "main_menu_help") groups := driver.FilterGroupsByName(session.Groups, "main_menu_help")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)

50
services/local.go Normal file
View File

@@ -0,0 +1,50 @@
// +build !online
package services
import (
"fmt"
"context"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
devremote "git.grassecon.net/grassrootseconomics/sarafu-api/dev"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
)
type localEmitter struct {
h *apievent.EventsHandler
}
func (d *localEmitter) emit(ctx context.Context, msg apievent.Msg) error {
var err error
if msg.Typ == apievent.EventTokenTransferTag {
tx, ok := msg.Item.(devremote.Tx)
if !ok {
return fmt.Errorf("not a valid tx")
}
ev := tx.ToTransferEvent()
err = d.h.Handle(ctx, apievent.EventTokenTransferTag, &ev)
} else if msg.Typ == apievent.EventRegistrationTag {
acc, ok := msg.Item.(devremote.Account)
if !ok {
return fmt.Errorf("not a valid tx")
}
ev := acc.ToRegistrationEvent()
err = d.h.Handle(ctx, apievent.EventRegistrationTag, &ev)
}
return err
}
func New(ctx context.Context, storageService storage.StorageService) remote.AccountService {
svc := devremote.NewDevAccountService(ctx, storageService)
svc = svc.WithAutoVoucher(ctx, "FOO", 42)
eu := event.NewEventsUpdater(svc, storageService)
emitter := &localEmitter{
h: eu.ToEventsHandler(),
}
svc = svc.WithEmitter(emitter.emit)
svc.AddVoucher(ctx, "BAR")
return svc
}

View File

@@ -4,8 +4,8 @@ TXTS = $(wildcard ./*.txt.orig)
VISE_PATH := ../../go-vise VISE_PATH := ../../go-vise
# Rule to build .bin files from .vis files # Rule to build .bin files from .vis files
%.vis: %.vis: buildasm
go run $(VISE_PATH)/dev/asm/main.go -f pp.csv $(basename $@).vis > $(basename $@).bin ./vise-asm -f pp.csv $(basename $@).vis > $(basename $@).bin
@echo "Built $(basename $@).bin from $(basename $@).vis" @echo "Built $(basename $@).bin from $(basename $@).vis"
# Rule to copy .orig files to .txt # Rule to copy .orig files to .txt
@@ -19,5 +19,10 @@ all: $(INPUTS) $(TXTS)
clean: clean:
rm -vf *.bin rm -vf *.bin
rm -vf ./vise-asm
buildasm:
go build -v -o ./vise-asm $(VISE_PATH)/dev/asm/main.go
.PHONY: clean .PHONY: clean

Binary file not shown.

View File

@@ -1 +1 @@
Your account is still being created. Your account is still being created. For more help, please call: 0757628885

View File

@@ -1 +1 @@
Akaunti yako bado inatengenezwa Akaunti yako bado inatengenezwa. Kwa usaidizi zaidi, piga: 0757628885

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,9 +1,11 @@
LOAD check_blocked_status 1
RELOAD check_blocked_status
CATCH blocked_account flag_account_blocked 1 CATCH blocked_account flag_account_blocked 1
CATCH select_language flag_language_set 0 CATCH select_language flag_language_set 0
CATCH terms flag_account_created 0 CATCH terms flag_account_created 0
LOAD check_account_status 0 LOAD check_account_status 0
RELOAD check_account_status 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 account_pending flag_account_pending 1
CATCH create_pin flag_pin_set 0 CATCH create_pin flag_pin_set 0
CATCH main flag_account_success 1 CATCH main flag_account_success 1

Binary file not shown.

View File

@@ -3,7 +3,7 @@ RELOAD transaction_reset
CATCH no_voucher flag_no_active_voucher 1 CATCH no_voucher flag_no_active_voucher 1
MOUT back 0 MOUT back 0
HALT HALT
LOAD validate_recipient 20 LOAD validate_recipient 50
RELOAD validate_recipient RELOAD validate_recipient
CATCH invalid_recipient flag_invalid_recipient 1 CATCH invalid_recipient flag_invalid_recipient 1
CATCH invite_recipient flag_invalid_recipient_with_invite 1 CATCH invite_recipient flag_invalid_recipient_with_invite 1

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More