diff --git a/common/user_store.go b/common/user_store.go index 29796e2..6c770d8 100644 --- a/common/user_store.go +++ b/common/user_store.go @@ -20,7 +20,7 @@ type UserDataStore struct { func (store *UserDataStore) ReadEntry(ctx context.Context, sessionId string, typ DataTyp) ([]byte, error) { store.SetPrefix(db.DATATYPE_USERDATA) store.SetSession(sessionId) - k := PackKey(typ, []byte(sessionId)) + k := ToBytes(typ) return store.Get(ctx, k) } @@ -29,6 +29,6 @@ func (store *UserDataStore) ReadEntry(ctx context.Context, sessionId string, typ func (store *UserDataStore) WriteEntry(ctx context.Context, sessionId string, typ DataTyp, value []byte) error { store.SetPrefix(db.DATATYPE_USERDATA) store.SetSession(sessionId) - k := PackKey(typ, []byte(sessionId)) + k := ToBytes(typ) return store.Put(ctx, k, value) } diff --git a/debug/db.go b/debug/db.go index ccc8630..eb62a41 100644 --- a/debug/db.go +++ b/debug/db.go @@ -4,8 +4,8 @@ import ( "fmt" "encoding/binary" - "git.grassecon.net/urdt/ussd/internal/storage" "git.grassecon.net/urdt/ussd/common" + "git.defalsify.org/vise.git/db" ) var ( @@ -30,11 +30,12 @@ func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) { o.SessionId = sessionId - k = k[len(b):] - o.Typ = k[0] + o.Typ = uint8(k[0]) k = k[1:] + o.SessionId = string(k[:len(b)]) + k = k[len(b):] - if o.Typ == storage.DATATYPE_USERSUB { + if o.Typ == db.DATATYPE_USERDATA { if len(k) == 0 { return o, fmt.Errorf("missing subtype key") } @@ -53,8 +54,19 @@ func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) { 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 common.DataTyp) string { - return dbTypStr[v + storage.DATATYPE_USERSUB + 1] + return dbTypStr[v + db.DATATYPE_USERDATA + 1] } func typToString(v uint8) string { diff --git a/debug/db_debug.go b/debug/db_debug.go index 7c17eed..ed2dd66 100644 --- a/debug/db_debug.go +++ b/debug/db_debug.go @@ -6,33 +6,43 @@ import ( "git.defalsify.org/vise.git/db" "git.grassecon.net/urdt/ussd/common" - "git.grassecon.net/urdt/ussd/internal/storage" ) func init() { DebugCap |= 1 - dbTypStr[db.DATATYPE_STATE] = "internal_state" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT] = "account" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_CREATED] = "account_created" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_TRACKING_ID] = "tracking id" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_PUBLIC_KEY] = "public key" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_CUSTODIAL_ID] = "custodial id" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_PIN] = "account pin" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_STATUS] = "account status" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_FIRST_NAME] = "first name" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_FAMILY_NAME] = "family name" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_YOB] = "year of birth" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_LOCATION] = "location" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_GENDER] = "gender" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_OFFERINGS] = "offerings" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_RECIPIENT] = "recipient" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_AMOUNT] = "amount" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_TEMPORARY_VALUE] = "temporary value" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_SYM] = "active sym" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_BAL] = "active bal" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_BLOCKED_NUMBER] = "blocked number" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_DECIMAL] = "active decimal" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_ADDRESS] = "active address" - dbTypStr[storage.DATATYPE_USERDATA + 1 + common.DATA_TRANSACTIONS] = "transactions" + dbTypStr[db.DATATYPE_STATE] = "internal state" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT] = "account" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_CREATED] = "account created" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TRACKING_ID] = "tracking id" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_PUBLIC_KEY] = "public key" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_CUSTODIAL_ID] = "custodial id" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_PIN] = "account pin" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACCOUNT_STATUS] = "account status" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_FIRST_NAME] = "first name" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_FAMILY_NAME] = "family name" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_YOB] = "year of birth" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_LOCATION] = "location" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_GENDER] = "gender" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_OFFERINGS] = "offerings" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_RECIPIENT] = "recipient" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_AMOUNT] = "amount" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TEMPORARY_VALUE] = "temporary value" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_SYM] = "active sym" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_BAL] = "active bal" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_BLOCKED_NUMBER] = "blocked number" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_DECIMAL] = "active decimal" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_ACTIVE_ADDRESS] = "active address" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_VOUCHER_SYMBOLS] = "voucher symbols" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_VOUCHER_BALANCES] = "voucher balances" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_VOUCHER_DECIMALS] = "voucher decimals" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_VOUCHER_ADDRESSES] = "voucher addresses" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_SENDERS] = "tx senders" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_RECIPIENTS] = "tx recipients" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_VALUES] = "tx values" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_ADDRESSES] = "tx addresses" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_HASHES] = "tx hashes" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_DATES] = "tx dates" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_SYMBOLS] = "tx symbols" + dbTypStr[db.DATATYPE_USERDATA + 1 + common.DATA_TX_DECIMALS] = "tx decimals" } diff --git a/debug/db_test.go b/debug/db_test.go index 2dae1e8..25f781d 100644 --- a/debug/db_test.go +++ b/debug/db_test.go @@ -2,12 +2,16 @@ package debug import ( "testing" + + "git.grassecon.net/urdt/ussd/common" + "git.defalsify.org/vise.git/db" ) func TestDebugDbSubKeyInfo(t *testing.T) { s := "foo" - b := []byte(s) - b = append(b, []byte{0x40, 0x00, 0x02}...) + b := []byte{0x20} + b = append(b, []byte(s)...) + b = append(b, []byte{0x00, 0x02}...) r, err := ToKeyInfo(b, s) if err != nil { t.Fatal(err) @@ -15,7 +19,7 @@ func TestDebugDbSubKeyInfo(t *testing.T) { if r.SessionId != s { t.Fatalf("expected %s, got %s", s, r.SessionId) } - if r.Typ != 64 { + if r.Typ != 32 { t.Fatalf("expected 64, got %d", r.Typ) } if r.SubTyp != 2 { @@ -30,8 +34,32 @@ func TestDebugDbSubKeyInfo(t *testing.T) { func TestDebugDbKeyInfo(t *testing.T) { s := "bar" - b := []byte(s) - b = append(b, []byte{0x20}...) + b := []byte{0x10} + b = append(b, []byte(s)...) + r, err := ToKeyInfo(b, s) + if err != nil { + t.Fatal(err) + } + if r.SessionId != s { + t.Fatalf("expected %s, got %s", s, r.SessionId) + } + if r.Typ != 16 { + t.Fatalf("expected 16, got %d", r.Typ) + } + if DebugCap & 1 > 0 { + if r.Label != "internal state" { + t.Fatalf("expected 'internal_state', got '%s'", r.Label) + } + } +} + +func TestDebugDbKeyInfoRestore(t *testing.T) { + s := "bar" + b := []byte{db.DATATYPE_USERDATA} + b = append(b, []byte(s)...) + k := common.ToBytes(common.DATA_ACTIVE_SYM) + b = append(b, k...) + r, err := ToKeyInfo(b, s) if err != nil { t.Fatal(err) @@ -40,11 +68,11 @@ func TestDebugDbKeyInfo(t *testing.T) { t.Fatalf("expected %s, got %s", s, r.SessionId) } if r.Typ != 32 { - t.Fatalf("expected 64, got %d", r.Typ) + t.Fatalf("expected 32, got %d", r.Typ) } if DebugCap & 1 > 0 { - if r.Label != "userdata" { - t.Fatalf("expected 'userdata', got '%s'", r.Label) + if r.Label != "active sym" { + t.Fatalf("expected 'active sym', got '%s'", r.Label) } } } diff --git a/devtools/gen/main.go b/devtools/gen/main.go new file mode 100644 index 0000000..401f194 --- /dev/null +++ b/devtools/gen/main.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "flag" + "fmt" + "os" + "path" + + "git.defalsify.org/vise.git/logging" + "git.grassecon.net/urdt/ussd/config" + "git.grassecon.net/urdt/ussd/internal/storage" + "git.grassecon.net/urdt/ussd/common" +) + +var ( + logg = logging.NewVanilla() + scriptDir = path.Join("services", "registration") +) + +func main() { + config.LoadConfig() + + var dbDir string + var sessionId string + var database string + var engineDebug bool + + flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") + flag.StringVar(&database, "db", "gdbm", "database to be used") + flag.StringVar(&dbDir, "dbdir", ".state", "database dir to read from") + flag.BoolVar(&engineDebug, "d", false, "use engine debug output") + flag.Parse() + + ctx := context.Background() + ctx = context.WithValue(ctx, "SessionId", sessionId) + ctx = context.WithValue(ctx, "Database", database) + + resourceDir := scriptDir + menuStorageService := storage.NewMenuStorageService(dbDir, resourceDir) + + store, err := menuStorageService.GetUserdataDb(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + userStore := common.UserDataStore{store} + + err = userStore.WriteEntry(ctx, sessionId, common.DATA_AMOUNT, []byte("1.0")) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + + err = store.Close() + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + +}