Compare commits

..

383 Commits

Author SHA1 Message Date
alfred-mk
d3ad3b2db6 update the template and remove hardcoded values 2025-05-20 10:26:28 +03:00
alfred-mk
5d8fee470a use the default pool variables 2025-05-20 10:26:01 +03:00
alfred-mk
cf237c592a add the pool variables to the config 2025-05-20 10:25:27 +03:00
alfred-mk
2d8333b89a add the new env variables 2025-05-20 10:19:46 +03:00
alfred-mk
c8146ea211 alfred/pool-swap (#33)
Some checks failed
release / docker (push) Has been cancelled
Pool swap functionality

Resolves issue #24

Reviewed-on: #33
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-19 15:44:50 +02:00
alfred-mk
d03c0c4c0e vouchers-input-selection (#75)
Some checks failed
release / docker (push) Has been cancelled
- Update the NEXT and PREV input selectors on the vouchers list
- Have the INCMPs before LOAD/RELOADs to prevent navigation inputs being passed to handler functions

Reviewed-on: #75
Reviewed-by: Mohamed Sohail <kamikazechaser@noreply.localhost>
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-19 15:42:43 +02:00
alfred-mk
e914d059e2 upgraded vise to refresh error logline for more context
Some checks failed
release / docker (push) Has been cancelled
2025-05-07 20:26:54 +03:00
alfred-mk
7b1676bb37 fixes: recipient address and phone number (#74)
Some checks failed
release / docker (push) Has been cancelled
- Add functionality to checksum addresses...resolves #66
- Remove white spaces from the recipient input...resolves #70

Reviewed-on: #74
Reviewed-by: Mohamed Sohail <kamikazechaser@noreply.localhost>
Co-authored-by: alfred-mk <alfredmwaik@gmail.com>
Co-committed-by: alfred-mk <alfredmwaik@gmail.com>
2025-05-07 11:45:38 +02:00
carlos
db5d55d8e3 Merge pull request 'route-api-errors' (#46) from route-api-errors into master
Reviewed-on: #46
2025-04-29 13:55:54 +02:00
Carlosokumu
06cab56427 fix failing tests: menuhandlers missing the logdb 2025-04-29 13:25:31 +03:00
Carlosokumu
d0c181bca2 Merge branch 'master' into route-api-errors 2025-04-29 12:58:46 +03:00
e379129b3d Merge pull request 'logdb' (#56) from logdb into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #56
2025-04-29 09:15:50 +02:00
Carlosokumu
29d35d1ec4 add write of the temporary and confirmed account pins to the log db 2025-04-28 15:49:40 +03:00
alfred-mk
687447e73e added the logdb to the testutil engine 2025-04-28 15:09:38 +03:00
alfred-mk
ec1ddefeb3 updated packages for sarafu-api and vise 2025-04-28 12:50:36 +03:00
alfred-mk
4166c9aed5 Merge branch 'master' into logdb 2025-04-28 12:38:27 +03:00
alfred-mk
78e82edfb5 added the logdn to the menuhandler tests 2025-04-28 12:26:06 +03:00
Carlosokumu
a5c4866b23 add required logdb to menuhandler 2025-04-28 11:50:25 +03:00
Carlosokumu
b52239e6be use direct key data type 2025-04-28 11:50:10 +03:00
Carlosokumu
5f02df64d7 upgrade visedriver dep 2025-04-28 11:40:28 +03:00
alfred-mk
0ba65fc48c use the updated phone and alias regexes from common 2025-04-28 11:39:37 +03:00
alfred-mk
ce8cc8e0fd use latest commit from sarafu-api 2025-04-28 11:38:45 +03:00
Carlosokumu
1499e4a29a check recipient before sending an sms 2025-04-28 11:38:44 +03:00
Carlosokumu
5f24ff3b1b feat: send invites when a recipient
is not resolved
2025-04-28 11:38:44 +03:00
Carlosokumu
6cdee7b58b update sarafu-api dep 2025-04-28 11:38:43 +03:00
alfred-mk
af5537abfc updated the description of DATA_SELF_PIN_RESET 2025-04-28 11:37:45 +03:00
alfred-mk
a6e569afb1 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
446514d8ce remove unused function reset_valid_pin 2025-04-28 11:37:44 +03:00
alfred-mk
131d106f38 use a single confirm_pin_change node 2025-04-28 11:37:43 +03:00
alfred-mk
4d62f0222e use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-28 11:37:43 +03:00
alfred-mk
37cc3e1bc1 cleanup: remove extra space in all .vis files 2025-04-28 11:37:42 +03:00
alfred-mk
491e97d8af cleanup: remove extra space 2025-04-28 11:37:42 +03:00
alfred-mk
d4fefe3c39 update the order for the INCMP statement 2025-04-28 11:37:41 +03:00
alfred-mk
e8ff468c7b update the reset flags in TestCheckBlockedStatus 2025-04-28 11:37:41 +03:00
alfred-mk
965f343230 update the reset flags in TestConfirmPinChange 2025-04-28 11:37:40 +03:00
alfred-mk
3426d31a9e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-28 11:37:40 +03:00
alfred-mk
8b2b667307 updated the expected content for the alias in view profile 2025-04-28 11:37:39 +03:00
alfred-mk
c206fa1329 updated the menu flow for the admin reset others PIN in test 2025-04-28 11:37:39 +03:00
alfred-mk
ad395c4b1a remove code related to admins resetting a user's actual PIN 2025-04-28 11:37:38 +03:00
alfred-mk
af7e6cc603 add a space 2025-04-28 11:37:38 +03:00
alfred-mk
f90a188acc updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-28 11:37:37 +03:00
alfred-mk
7a542d1f1c updated the description of the flag_incorrect_pin 2025-04-28 11:37:37 +03:00
alfred-mk
7d800d68a0 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-28 11:37:36 +03:00
alfred-mk
850458b5d8 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-28 11:37:36 +03:00
alfred-mk
ef8e3d5c35 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-28 11:37:35 +03:00
alfred-mk
982eebf374 move to the top node when one selects back 2025-04-28 11:37:35 +03:00
alfred-mk
228d936a0e use the confirm_self_pin_reset to confirm the new PIN 2025-04-28 11:37:34 +03:00
alfred-mk
7c4d37b5b8 use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
e6e8bb6671 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-28 11:37:33 +03:00
alfred-mk
6385735b89 move back to the previous node if the admin user is not authorized 2025-04-28 11:34:27 +03:00
alfred-mk
70815aabd1 request the admin to authorize the PIN reset 2025-04-28 11:34:27 +03:00
alfred-mk
919899c704 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-28 11:34:26 +03:00
alfred-mk
9a2ad99d07 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-28 11:34:26 +03:00
alfred-mk
2f4959e191 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-28 11:34:25 +03:00
alfred-mk
1b2f3bb046 added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-28 11:34:24 +03:00
carlos
19a2b28367 Merge pull request 'extra-sms' (#64) from extra-sms into master
Reviewed-on: #64
2025-04-28 10:33:25 +02:00
alfred-mk
25d124c58d use updated go-vise that removes rollback on missing key 2025-04-25 17:10:46 +03:00
alfred-mk
5b34ef28eb added the logDb to async and http 2025-04-25 09:33:08 +03:00
Carlosokumu
0370a3def4 use dedicated smsservice for triggering extra sms 2025-04-18 12:13:24 +03:00
Carlosokumu
7c0651d218 use dedicated sms package for triggering sms 2025-04-18 12:12:33 +03:00
Carlosokumu
a38ac06a3d trigger an address sms in the check_identifier handler 2025-04-18 10:56:41 +03:00
Carlosokumu
ac2a3721b2 remove dedicated address sms trigger 2025-04-18 10:55:02 +03:00
Carlosokumu
7ea3cb6b51 remove reload for check identifier to prevent double address sms trigger 2025-04-18 10:54:23 +03:00
Carlosokumu
0274133d48 add handler to send an address sms 2025-04-17 23:32:05 +03:00
Carlosokumu
5ff2e794ff feat: implement address and pin reset sms 2025-04-17 23:31:48 +03:00
Carlosokumu
08deeca500 register handler to trigger address sms 2025-04-17 23:31:22 +03:00
Carlosokumu
cea920c1f5 dep: upgrade sarafu-api dep to include address and pin reset sms 2025-04-17 23:30:54 +03:00
ade236747c Merge pull request 'use the updated phone and alias regexes from common' (#63) from update-recipient-validator into master
Reviewed-on: #63
2025-04-17 16:53:42 +02:00
alfred-mk
e1a3729e3b use the updated phone and alias regexes from common 2025-04-17 14:31:18 +03:00
Carlosokumu
f127fd7c0f initialize log db ,attach it to the menuhandler 2025-04-14 11:34:37 +03:00
alfred-mk
42177aadeb use latest commit from sarafu-api
Some checks failed
release / docker (push) Has been cancelled
2025-04-11 11:10:48 +03:00
fa9f1a72ef Merge pull request 'self pin reset' (#49) from self-pin-reset-node into master
Reviewed-on: #49
2025-04-11 09:26:11 +02:00
alfred-mk
4ffb32f14a Merge branch 'master' into self-pin-reset-node 2025-04-11 10:25:35 +03:00
c41277db87 Merge pull request 'sms-upsell' (#55) from sms-upsell into master
Reviewed-on: #55
2025-04-11 09:24:35 +02:00
alfred-mk
56cda36aa7 updated the description of DATA_SELF_PIN_RESET 2025-04-10 13:55:00 +03:00
alfred-mk
c9170ca45a Merge branch 'master' into self-pin-reset-node 2025-04-09 23:43:10 +03:00
alfred-mk
57a1645c03 remove the verify_new_pin functionality that managed the unused flag_valid_pin 2025-04-09 23:40:03 +03:00
alfred-mk
7d9c3b66a9 remove unused function reset_valid_pin 2025-04-09 19:29:40 +03:00
alfred-mk
aec1f4c4c1 use a single confirm_pin_change node 2025-04-09 19:23:46 +03:00
alfred-mk
d680387ef1 use the same check for flag_invalid_pin to move to the invalid_pin node 2025-04-09 19:21:35 +03:00
alfred-mk
0337c66f96 cleanup: remove extra space in all .vis files 2025-04-09 18:17:59 +03:00
alfred-mk
6070792fe4 cleanup: remove extra space 2025-04-09 18:14:10 +03:00
alfred-mk
69ae494b2c update the order for the INCMP statement 2025-04-09 18:10:51 +03:00
alfred-mk
b89abf3487 update the reset flags in TestCheckBlockedStatus 2025-04-09 18:06:24 +03:00
alfred-mk
4ef8c47f8b update the reset flags in TestConfirmPinChange 2025-04-09 18:01:40 +03:00
alfred-mk
1076a9578e use the correct flag_invalid_pin in TestSaveTemporaryPin 2025-04-09 17:57:54 +03:00
alfred-mk
a27d44e561 updated the expected content for the alias in view profile 2025-04-09 17:52:58 +03:00
alfred-mk
35a2732fe2 updated the menu flow for the admin reset others PIN in test 2025-04-09 17:52:18 +03:00
alfred-mk
834f2ce629 remove code related to admins resetting a user's actual PIN 2025-04-09 17:39:41 +03:00
alfred-mk
26353bdf6e add a space 2025-04-09 17:34:24 +03:00
alfred-mk
1f6bf2bbed updated the flags set and reset in SaveTemporaryPin and VerifyCreatePin 2025-04-09 16:59:48 +03:00
alfred-mk
0c1d9ab582 updated the description of the flag_incorrect_pin 2025-04-09 16:58:13 +03:00
alfred-mk
29d94bb2e5 have the catch for create_pin above to catch accounts that do not have a PIN before the status on chain is checked 2025-04-09 16:57:22 +03:00
alfred-mk
067c496244 use a single pin_mismatch node for a confirmed PIN that does not match the original PIN 2025-04-09 16:55:46 +03:00
alfred-mk
f8c258a3b4 allow the user to quit and move to invalid_pin node if the given input is invalid 2025-04-09 16:49:04 +03:00
alfred-mk
aec96ce9ba move to the top node when one selects back 2025-04-09 15:19:23 +03:00
alfred-mk
71ef950fff use the confirm_self_pin_reset to confirm the new PIN 2025-04-09 15:12:51 +03:00
alfred-mk
477f3a307a use the self_reset_pin node to reset PINs for accounts with a flag_account_pin_reset 2025-04-09 15:11:51 +03:00
alfred-mk
33c376c971 set the DATA_SELF_PIN_RESET as 0 and reset the flag_account_pin_reset 2025-04-09 15:10:12 +03:00
Carlosokumu
79bf09f3d1 add logdb to menuhandler and associated write operations 2025-04-09 14:55:35 +03:00
Carlosokumu
f4804546d9 add log db struct with associated methods 2025-04-09 14:52:57 +03:00
Carlosokumu
3fff03a164 update visedriver dep 2025-04-09 14:50:28 +03:00
Carlosokumu
094866c129 add a logdb field to lhs and setter function 2025-04-09 14:49:41 +03:00
alfred-mk
514f6ae05b move back to the previous node if the admin user is not authorized 2025-04-08 16:26:21 +03:00
alfred-mk
8a6659a98b request the admin to authorize the PIN reset 2025-04-08 16:25:50 +03:00
alfred-mk
d094af9c51 move to the authorize_reset_others_pin if the given number is valid and registered 2025-04-08 16:25:11 +03:00
alfred-mk
f96f9c11e6 updated the ResetOthersPin and ValidateBlockedNumber for the updated reset other's PIN functionality 2025-04-08 16:23:21 +03:00
Carlosokumu
1d8b0ef951 Merge branch 'master' into sms-upsell 2025-04-07 11:45:29 +03:00
Carlosokumu
fb2dc003b8 check recipient before sending an sms 2025-04-07 11:38:52 +03:00
alfred-mk
a11ca2a618 reset the flag_language_set and flag_account_created flags if the publicKey does not exist on the db
Some checks failed
release / docker (push) Has been cancelled
2025-04-04 12:05:04 +03:00
4268cc0589 build: logdebug mode
Some checks failed
release / docker (push) Has been cancelled
2025-04-03 15:45:41 +03:00
alfred-mk
ae0672c7da updated the vise version to pop the cache on a new session
Some checks failed
release / docker (push) Has been cancelled
2025-04-02 18:34:04 +03:00
alfred-mk
2c671bc0d4 use the DATA_SELF_PIN_RESET to set the flag_account_pin_reset 2025-04-02 18:29:04 +03:00
alfred-mk
c5673b339b added a DATA_SELF_PIN_RESET to track when a user's PIN is reset by an admin 2025-04-02 18:24:34 +03:00
Carlosokumu
58242c8d55 fix failing test: TestManageVouchers 2025-04-02 10:53:36 +03:00
Carlosokumu
cab90ed89a set and reset flag_api_error flag 2025-04-02 10:48:04 +03:00
Carlosokumu
73c3486400 catch api call failure when manage vouchers is called 2025-04-02 10:47:33 +03:00
Carlosokumu
3c84fb5ae7 Merge branch 'master' into route-api-errors 2025-04-02 10:38:47 +03:00
c3567313af Merge pull request 'manage vouchers in single function' (#42) from manage-vouchers-in-single-function into master
Reviewed-on: #42
2025-04-01 21:26:28 +02:00
f82b413e34 Merge branch 'master' into manage-vouchers-in-single-function 2025-04-01 21:26:16 +02:00
Carlosokumu
695bfed349 feat: send invites when a recipient
is not resolved
2025-04-01 16:30:08 +03:00
Carlosokumu
8bf48cb081 update sarafu-api dep 2025-04-01 16:25:59 +03:00
Carlosokumu
04880b58a8 fix failing test 2025-04-01 12:49:10 +03:00
Carlosokumu
0458ac9498 fix failing test 2025-04-01 12:38:57 +03:00
Carlosokumu
a7e8c184f5 add some spacing 2025-04-01 11:59:31 +03:00
Carlosokumu
3615348efd add swahili template 2025-04-01 11:57:59 +03:00
Carlosokumu
d0be79d817 set account creation failed flag 2025-04-01 11:30:00 +03:00
alfred-mk
ea0fc4491d removed debug related logs 2025-04-01 11:12:38 +03:00
Carlosokumu
7883063e53 feat: set and reset api call failure flags 2025-03-31 15:42:27 +03:00
Carlosokumu
f562ce8adf check for api call failure when setting the dafault voucher 2025-03-31 15:41:49 +03:00
Carlosokumu
cd2f4328a8 check for api call failure when checking transactions 2025-03-31 15:41:19 +03:00
Carlosokumu
95b9a6e486 catch api call failure when fetching voucher details 2025-03-28 16:09:53 +03:00
Carlosokumu
9674a04cbc add handler to reset api call failure flag,set flag when requesting an alias fails 2025-03-28 15:51:56 +03:00
Carlosokumu
6c46c097fb add explicit api call failure flag reset 2025-03-28 15:47:34 +03:00
Carlosokumu
c814c4ae5c register handler to reset api call failure flag 2025-03-28 15:46:57 +03:00
Carlosokumu
bbecec0310 catch api call error when requesting an alias 2025-03-28 15:46:21 +03:00
Carlosokumu
eaa89c29df Merge branch 'master' into route-api-errors 2025-03-28 15:22:40 +03:00
carlos
2634790118 Merge pull request 'use a different key for the suggested aliases' (#47) from fix-double-alias-request into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #47
2025-03-28 09:35:10 +01:00
Carlosokumu
272a7ac05f chore: remove extra colon 2025-03-28 11:32:24 +03:00
Carlosokumu
39c0d31995 remove verbose logs 2025-03-28 11:26:32 +03:00
Carlosokumu
18acb53ead add alias logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-28 11:08:50 +03:00
Carlosokumu
43d91f84f6 use a different key for the suggested aliases 2025-03-28 10:49:31 +03:00
Carlosokumu
e832f46d22 return to top on retry 2025-03-26 14:40:54 +03:00
Carlosokumu
039117f40e add api call failure catch 2025-03-26 14:40:32 +03:00
Carlosokumu
3532f72fbd remove unneccessary catch 2025-03-26 14:39:37 +03:00
Carlosokumu
04c7e20457 set api call error flag to failing api calls 2025-03-26 14:38:47 +03:00
alfred-mk
0914217769 increase the size limit for the manage_vouchers 2025-03-26 14:33:23 +03:00
alfred-mk
ea117b7222 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:28:43 +03:00
alfred-mk
39e1c84a45 added TestManageVouchers for ManageVouchers 2025-03-26 14:27:17 +03:00
alfred-mk
20ee4dfb24 replace SetDefaultVoucher and CheckVouchers with ManageVouchers 2025-03-26 14:26:31 +03:00
0791eb1f11 ci/cd: build with log warn only
Some checks failed
release / docker (push) Has been cancelled
2025-03-25 09:52:37 +03:00
alfred-mk
8ebd2bbbfa remove alias updates from TestUpdateAllProfileItems
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 20:06:07 +03:00
alfred-mk
06c534cbb1 remove the subprefix db from TestViewVoucher 2025-03-24 20:03:20 +03:00
alfred-mk
b8d53f82bb remove the subprefix db from TestGetVoucherList 2025-03-24 20:01:44 +03:00
alfred-mk
71c01e00cd remove commented out code 2025-03-24 19:58:43 +03:00
alfred-mk
419716a2b4 remove the subprefix db from TestCheckVouchers 2025-03-24 19:57:08 +03:00
alfred-mk
54b2088842 Pass correct arguments in the TestGetVoucherData 2025-03-24 19:53:02 +03:00
alfred-mk
b2208359d6 Add missing param to the GetVoucherData 2025-03-24 19:46:58 +03:00
alfred-mk
0828b1eb10 Increase the limit for the max_amount output 2025-03-24 19:46:58 +03:00
carlos
c22f9edeca Merge pull request 'fix-multiple-alias-requests' (#38) from fix-multiple-alias-requests into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #38
2025-03-24 15:47:26 +01:00
Carlosokumu
c81b17994a remove redundant cast on sanitized input 2025-03-24 16:03:30 +03:00
Carlosokumu
64b42b92ec Merge branch 'master' into fix-multiple-alias-requests 2025-03-24 16:00:20 +03:00
Carlosokumu
493f64157b sanitize alias hint before request 2025-03-24 15:59:13 +03:00
Carlosokumu
f6c9d54a65 register check-account_created handler
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:39:03 +03:00
Carlosokumu
74c82de472 add check for if public key exists,then explicitly set flag_account_created
Some checks failed
release / docker (push) Has been cancelled
2025-03-24 12:29:40 +03:00
Carlosokumu
ddb8c6e748 add lowercase balance text translation 2025-03-22 18:39:05 +03:00
Carlosokumu
87ebd0029b chore: show default value when profile info is not set 2025-03-22 18:38:35 +03:00
Carlosokumu
b941cf2562 chore: match profile text prompt 2025-03-22 18:37:27 +03:00
Carlosokumu
1c8bda5ded fix(alias): remove alias requests made when a profile item is edited,show a default value when an alias is not set 2025-03-22 09:49:19 +03:00
alfred-mk
30cb800450 Added log lines for voucherlist
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:58:30 +03:00
alfred-mk
680a1e9681 Use userstore for the voucher data instead of subprefixdb
Some checks failed
release / docker (push) Has been cancelled
2025-03-21 13:46:13 +03:00
Carlosokumu
b327b569fb fix failing test 2025-03-21 09:05:51 +03:00
alfred-mk
445ca0d0ff Add a default alias to remove bug in retrieving the data
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 22:34:04 +03:00
alfred-mk
e681c9cfca Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:23:36 +03:00
alfred-mk
d504571014 Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 15:07:02 +03:00
alfred-mk
3b16e25ebd Added debug logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:54:06 +03:00
alfred-mk
5f37856927 Added activeSym logs
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 14:35:06 +03:00
Carlosokumu
e564f1328b add fetched vouchers log
Some checks failed
release / docker (push) Has been cancelled
2025-03-20 13:48:34 +03:00
374f79388c ci/cd: remove ssh binary from Docker builds
Some checks failed
release / docker (push) Has been cancelled
2025-03-18 17:48:55 +03:00
lash
30644d3535 Merge branch 'lash/more-edbug' 2025-03-15 03:12:05 +00:00
lash
e5e857e3cb Upgrade deps 2025-03-15 03:02:25 +00:00
Carlosokumu
1af826e87f dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 12:41:16 +03:00
Carlosokumu
38ef3b623e dep: update sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-10 11:53:47 +03:00
Carlosokumu
f7e7f7bd1c add for check back,add logs for the alias 2025-03-10 11:51:02 +03:00
Carlosokumu
bd0e7822ed dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 16:13:23 +03:00
Carlosokumu
4dba5f2ab5 dep: upgrade sarafu-api dep
Some checks failed
release / docker (push) Has been cancelled
2025-03-07 09:48:30 +03:00
144398e18b Merge pull request 'ens' (#32) from ens into master
Reviewed-on: #32
Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
2025-03-07 06:00:17 +01:00
Carlosokumu
e97d4be296 refactor: break down checkbalance function to avoild code redandancy,remove misplaced flag setting 2025-03-03 12:16:45 +03:00
Carlosokumu
c2a0b05c84 fix: update expected content in checkbalance function 2025-03-03 12:12:46 +03:00
Carlosokumu
20c8af582c switch to use ens api endpoint for the aliases requests 2025-02-28 17:29:18 +03:00
Carlosokumu
101afd5ebd update check balance test 2025-02-27 16:35:41 +03:00
Carlosokumu
830d867ac8 chore: remove alias tag,use lower case b for balance 2025-02-27 16:35:17 +03:00
Carlosokumu
0cbe391209 update test data file to include my alias menu option 2025-02-27 16:00:54 +03:00
Carlosokumu
226d1f5697 fix: update authorize test function 2025-02-27 13:21:42 +03:00
Carlosokumu
3e422f269f feat: show alias if set on main node 2025-02-27 13:14:27 +03:00
Carlosokumu
7a6e5b094f load current alias 2025-02-27 09:42:25 +03:00
Carlosokumu
5ed63cec39 reset invalid PIN flag 2025-02-27 09:41:02 +03:00
Carlosokumu
8f7d5ff66d feat: add request for ens based names from user input 2025-02-26 16:34:00 +03:00
Carlosokumu
f922fb6d43 update authorize_account sink value 2025-02-26 15:48:25 +03:00
Carlosokumu
78af4d225f add alias account template 2025-02-26 15:47:17 +03:00
Carlosokumu
b887c67e5d add node to confirm your alias 2025-02-26 15:14:04 +03:00
Carlosokumu
0816190469 feat: add node to update your alias 2025-02-26 15:08:29 +03:00
Carlosokumu
28e734e0ba feat: add my alias menu option 2025-02-26 15:02:28 +03:00
Carlosokumu
d92dc026f5 check for invalid PIN 2025-02-26 14:51:16 +03:00
Carlosokumu
939df35c8c register new menu handlers 2025-02-26 14:48:19 +03:00
Carlosokumu
c09ce32010 feat: reset invalid pin flag,update template text 2025-02-26 14:46:09 +03:00
Carlosokumu
1f0e7c016e add check for account alias data type 2025-02-26 14:40:17 +03:00
Carlosokumu
a984c9dd06 add invalid and account alias flags 2025-02-26 14:37:54 +03:00
carlos
e2d5546de1 Merge pull request 'fix-pin-reset-bug' (#26) from fix-pin-reset-bug into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #26
2025-02-21 10:31:45 +01:00
alfred-mk
95089875bf remove extra spacing 2025-02-21 12:30:28 +03:00
alfred-mk
4db25055ad Added a fix for invalid PIN in PIN reset 2025-02-21 12:29:28 +03:00
alfred-mk
e8e6f0e371 Added a fix to only hash valid PINs in SaveOthersTemporaryPin 2025-02-21 11:49:51 +03:00
Carlosokumu
91c4967efa check for back 2025-02-21 11:01:42 +03:00
Carlosokumu
7b1824f18c go back if account not unlocked 2025-02-21 11:01:31 +03:00
Carlosokumu
04c3f5ce65 repeat same node on invalid input 2025-02-21 11:01:14 +03:00
Carlosokumu
e646658f40 repeat same node on invalid input 2025-02-21 10:56:12 +03:00
Carlosokumu
c4cab444ad repeat same node on invalid input 2025-02-20 21:26:53 +03:00
Carlosokumu
b5ade9112e catch incorrect pin when resetting for others 2025-02-20 21:21:20 +03:00
Carlosokumu
3b9184e852 check for back 2025-02-20 21:20:41 +03:00
alfred-mk
07b85768d1 Merge branch 'master' into fix-pin-reset-bug 2025-02-20 20:00:21 +03:00
alfred-mk
c9678df152 reset the PIN using the formattedNumber 2025-02-20 19:59:52 +03:00
alfred-mk
c37fee5e54 have the secondarySessionId as a formatted phone number 2025-02-20 19:58:12 +03:00
alfred-mk
98b2a31655 remove extra space 2025-02-20 19:56:48 +03:00
d4fcf40b8d Merge pull request 'remove the sessionId from the ctx' (#25) from remove-session-id-from-ctx into master
Reviewed-on: #25
2025-02-20 17:28:54 +01:00
alfred-mk
83a10efcd9 remove the sessionId from the ctx to prevent double sessionId key (<sessionId>.<sessionId>) 2025-02-20 15:10:18 +03:00
0089d6f125 Merge pull request 'tests-menu-traversal' (#16) from tests-menu-traversal into master
Reviewed-on: #16
2025-02-13 10:00:42 +01:00
a7d13dc7c4 Merge branch 'master' into tests-menu-traversal 2025-02-13 09:59:11 +01:00
bed7f58e81 Merge pull request 'alfred/test-updates' (#15) from alfred/test-updates into master
Reviewed-on: #15
2025-02-13 09:58:45 +01:00
alfred-mk
07fd1110ed added documentation lines 2025-02-11 13:22:32 +03:00
alfred-mk
2f1dbb9147 added TestClearTemporaryValue 2025-02-11 13:10:56 +03:00
Carlosokumu
93f1897321 Merge branch 'master' into tests-menu-traversal 2025-02-11 13:07:07 +03:00
alfred-mk
c324e29aea added test case to the TestCheckVouchers 2025-02-11 13:00:23 +03:00
alfred-mk
f91056cca2 Merge branch 'master' into alfred/test-updates 2025-02-11 12:53:41 +03:00
Carlosokumu
7d11377ffd test empty input. 2025-02-11 12:45:52 +03:00
Carlosokumu
9a63234470 set and reset admin flag using persister's state 2025-02-10 15:45:15 +03:00
Carlosokumu
fe74dbb848 add test for menu select voucher 2025-02-10 15:37:05 +03:00
Carlosokumu
278edc7049 test reset other's pin with registred and unregistred phone number 2025-02-10 13:31:18 +03:00
Carlosokumu
3b03d40279 return the persister and flag parser 2025-02-10 12:52:01 +03:00
Carlosokumu
4d46133194 chore: add some spacing 2025-02-10 12:10:17 +03:00
fd84f6ae98 Merge pull request 'debug-errors-with-temporary-value' (#22) from debug-errors-with-temporary-value into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #22
2025-02-06 14:43:59 +01:00
alfred-mk
1e8d5b1b83 Remove left over code comment 2025-02-06 16:42:39 +03:00
alfred-mk
628a57ea10 Only clear the temporary data once at main.vis 2025-02-06 16:42:07 +03:00
alfred-mk
a37908323f Remove early LOAD statement 2025-02-06 16:32:03 +03:00
lash
9c27be3a9d Update sarafu-api dep 2025-02-06 12:24:35 +00:00
alfred-mk
1190c5b6f2 Merge branch 'master' into alfred/test-updates 2025-02-06 15:19:40 +03:00
b95452ae5f Merge pull request 'clear-temporary-valua-after-use' (#21) from clear-temporary-valua-after-use into master
Reviewed-on: #21
2025-02-06 13:18:41 +01:00
alfred-mk
14df16098c Updated tests to include the mockState 2025-02-06 15:10:15 +03:00
alfred-mk
1cdd5a37ae Merge branch 'master' into alfred/test-updates 2025-02-06 15:02:18 +03:00
Carlosokumu
6b3b8ffabe add alias request and resolve logs 2025-02-06 14:57:29 +03:00
alfred-mk
6647416115 Return an error if the temporary value is empty 2025-02-06 14:38:11 +03:00
alfred-mk
4155b267ee Clear the temporary value after use 2025-02-06 14:23:42 +03:00
0f2d6def23 Merge pull request 'lash/custom-engin' (#20) from lash/custom-engin into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #20
2025-02-06 11:11:48 +01:00
lash
c13768d782 Remove custom engine 2025-02-05 17:56:08 +00:00
lash
af4b075df3 Add reset on empty to ssh 2025-02-05 17:45:31 +00:00
lash
1d7027905d Use simplified reset on empty input solution 2025-02-05 17:44:29 +00:00
lash
6c77d04284 Merge branch 'lash/async-inputs' into lash/custom-engin 2025-02-05 16:27:10 +00:00
lash
12acd508b1 Allow empty input in async cmd 2025-02-05 16:26:17 +00:00
alfred-mk
f88e253486 Call the engine Reset 2025-02-05 19:16:25 +03:00
alfred-mk
68597ea7cc Return the Sarafu Engine in GetEngine 2025-02-05 19:08:36 +03:00
alfred-mk
3d9eeddab8 Remove the Move to top node on empty input test case 2025-02-05 19:07:35 +03:00
alfred-mk
df58f69032 Remove input length check on menuhandler Init 2025-02-05 19:02:23 +03:00
Carlosokumu
8b999a09a2 add test cases 2025-02-05 18:04:29 +03:00
lash
fdde1bb979 Add missing services import in ssh 2025-02-05 10:28:20 +00:00
lash
23cadc6178 Reinstate loading handlerfuncs in cmd, ssh clients 2025-02-05 10:21:21 +00:00
Carlosokumu
0821241427 repeat same node on invalid option 2025-02-05 10:23:31 +03:00
Carlosokumu
ca71062528 Merge branch 'master' into tests-menu-traversal 2025-02-05 09:11:16 +03:00
1918ea37d5 Merge pull request 'Bug fixes and menu improvement' (#19) from minor-bug-fixes into master
Reviewed-on: #19
Reviewed-by: lash <accounts-grassrootseconomics@holbrook.no>
2025-02-04 14:36:20 +01:00
lash
422b651097 Add missing file 2025-02-04 13:33:44 +00:00
lash
861d04dbfd WIP Implement custom engine 2025-02-04 13:25:17 +00:00
alfred-mk
c78081fb84 added TestInsertOrShift 2025-02-04 11:42:14 +03:00
alfred-mk
ff3c597158 added TestUpdateAllProfileItems 2025-02-04 11:03:23 +03:00
alfred-mk
09c5f3a14c added TestInsertProfileItems 2025-02-04 10:30:39 +03:00
Carlosokumu
f7873bfef7 add mock state to failing tests 2025-02-04 10:16:12 +03:00
Carlosokumu
815e3b2a25 remove unused handler 2025-02-04 09:46:33 +03:00
Carlosokumu
f9a9a9b4a6 preload all common functions 2025-02-04 08:44:10 +03:00
Carlosokumu
04429ab74c fix: wrong pin count by load and reload handlers 2025-02-04 08:43:55 +03:00
Carlosokumu
d3f1a14e71 replace back with retry option 2025-02-04 08:41:55 +03:00
Carlosokumu
5722d4f8dd reset flags on back navigation,process only numeric pin entries 2025-02-04 08:41:06 +03:00
carlos
cad18c9e64 Merge pull request 'use the latest changes from grassrootseconomics/visedriver-africastalking' (#17) from update-dependency into master
Some checks failed
release / docker (push) Has been cancelled
Reviewed-on: #17
2025-01-29 09:18:49 +01:00
alfred-mk
fbff584bb4 use the latest changes from grassrootseconomics/visedriver-africastalking 2025-01-29 10:14:01 +03:00
Carlosokumu
4169419442 add test for reset without privileges 2025-01-28 09:28:40 +03:00
Carlosokumu
bef62b97e7 extract remaining pin attempts 2025-01-27 14:00:42 +03:00
Carlosokumu
56d0baad6e test block account 2025-01-27 14:00:18 +03:00
alfred-mk
5a586eb67a added TestConstructAccountAlias 2025-01-27 13:31:00 +03:00
alfred-mk
6a945f8f20 added TestResetUnregisteredNumber 2025-01-27 12:53:02 +03:00
alfred-mk
39f8c86e8b added TestResetValidPin 2025-01-27 12:50:46 +03:00
alfred-mk
73b501c8aa removed left over commented code 2025-01-27 12:42:48 +03:00
alfred-mk
a6cd4b5fca added TestResetOthersPin 2025-01-27 12:36:04 +03:00
alfred-mk
d47bc6c241 Merge branch 'master' into alfred/test-updates 2025-01-27 12:23:13 +03:00
alfred-mk
dd55906e70 added TestGetCurrentProfileInfo 2025-01-27 11:35:05 +03:00
alfred-mk
6fdf3735d0 added TestCheckBlockedNumPinMisMatch 2025-01-27 10:52:43 +03:00
alfred-mk
b492421851 enhanced the TestSaveOthersTemporaryPin 2025-01-27 10:40:35 +03:00
alfred-mk
128c0162d2 added TestSaveOthersTemporaryPin 2025-01-27 02:13:53 +03:00
alfred-mk
ebe94c705f added TestValidateBlockedNumber 2025-01-27 01:46:14 +03:00
alfred-mk
df0c1b3429 added TestQuitWithHelp and TestShowBlockedAccount 2025-01-27 01:25:01 +03:00
alfred-mk
d66fd894bc added TestMaxAmount 2025-01-27 01:17:44 +03:00
alfred-mk
28185fc2c5 added TestRetrieveBlockedNumber 2025-01-27 01:05:32 +03:00
d2f75c693a Merge pull request 'alias-fqdn' (#9) from alias-fqdn into master
Reviewed-on: #9
2025-01-25 13:46:29 +01:00
Carlosokumu
363c35efed update test data file 2025-01-25 09:55:39 +03:00
alfred-mk
64a87231ca removed redundant type from array 2025-01-24 15:43:42 +03:00
carlos
0f361a065b Merge branch 'master' into alias-fqdn 2025-01-24 13:08:29 +01:00
lash
4d1045a9f9 Adapt override to non-pointer values 2025-01-24 15:03:47 +03:00
lash
f3a6485bb3 Avoid overwrite of env configs 2025-01-24 15:02:31 +03:00
Carlosokumu
cd37adc288 update test 2025-01-24 15:02:30 +03:00
Carlosokumu
6f0994d692 feat: show alias as part of the profile information 2025-01-24 15:02:30 +03:00
lash
fbaba15776 Adapt override to non-pointer values 2025-01-24 10:15:37 +00:00
lash
9a094f440f Avoid overwrite of env configs 2025-01-24 08:47:23 +00:00
carlos
6c77ff58ab Merge branch 'master' into alias-fqdn 2025-01-24 09:44:50 +01:00
Carlosokumu
c8ddafcf66 run go mod tidy 2025-01-24 11:41:25 +03:00
Carlosokumu
5f1a659789 request alias on initial profile setup 2025-01-24 11:41:00 +03:00
Carlosokumu
0d4be0f7fc return nil when error is key not found 2025-01-24 10:12:28 +03:00
Carlosokumu
b6161da749 fix failing test 2025-01-24 09:32:21 +03:00
f1c4d5f1f9 docker: change bin name -> sarafu-at 2025-01-24 09:26:00 +03:00
73b876dbdd ci/cd: add Dockerfile and GH builds 2025-01-24 09:25:09 +03:00
Carlosokumu
18e865ba26 set UseApi and storageservice to HttpAccountService 2025-01-24 07:59:33 +03:00
Carlosokumu
d7c909f028 update sarafu-api dep 2025-01-24 07:58:03 +03:00
Carlosokumu
908a52cda6 Merge branch 'master' into alias-fqdn 2025-01-24 07:41:33 +03:00
alfred-mk
0e480e3d55 enhanced the TestViewTransactionStatement 2025-01-23 16:08:04 +03:00
alfred-mk
ffea1a0b96 added TestViewTransactionStatement 2025-01-23 15:54:50 +03:00
alfred-mk
be5bd16616 added TestGetTransactionsList 2025-01-23 15:06:12 +03:00
alfred-mk
93723616f6 added TestCheckTransactions 2025-01-23 13:42:17 +03:00
alfred-mk
c9257ba0d6 added TestPersistInitialLanguageCode 2025-01-23 11:47:12 +03:00
alfred-mk
caabf4f8af updated the structure of TestPersistLanguageCode 2025-01-23 11:30:25 +03:00
alfred-mk
f884b19012 added TestCheckBlockedStatus 2025-01-23 11:29:57 +03:00
carlos
526dc822fb Merge pull request 'remove unused New conn argument' (#14) from fix-remote-new-args into master
Reviewed-on: #14
2025-01-23 09:29:25 +01:00
Carlosokumu
1249e45d54 remove unused New conn argument 2025-01-23 11:22:34 +03:00
lash
99d03e3bc9 Fix signal handling for termination, proper engine cleanup 2025-01-22 19:08:57 +00:00
lash
1e495763f5 Fmt 2025-01-22 18:37:27 +00:00
lash
5e83c89e03 Correct override handling for mode 2025-01-22 16:40:32 +00:00
lash
1909b60bf4 Reinstate resource-dir switch 2025-01-22 09:42:39 +00:00
lash
49335a290f Gofmt, remove commented code 2025-01-21 15:43:26 +00:00
lash
2c8e60e1bb Add gdbmdb testutil 2025-01-21 15:02:32 +00:00
lash
4baacb325d Merge branch 'master' into lash/dbtx 2025-01-21 14:26:48 +00:00
lash
c243edd4c4 Make override constructor for args population 2025-01-21 14:25:55 +00:00
44846c5950 Merge pull request 'Add transactional vise db ability' (#11) from lash/dbtx into master
Reviewed-on: #11
2025-01-21 15:15:15 +01: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
Carlosokumu
ec6b078de3 fix: import config and model packages 2025-01-21 15:23:21 +03:00
Carlosokumu
0b4fde9d1e Merge branch 'master' into alias-fqdn 2025-01-21 12:53:50 +03:00
Carlosokumu
66be350ad1 remove accountservice implementation check 2025-01-21 12:48:17 +03: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
1e69f2167a Merge branch 'master' into alias-fqdn 2025-01-20 12:32:29 +03: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
Carlosokumu
f435046385 Merge branch 'master' into alias-fqdn 2025-01-18 08:01:58 +03:00
Carlosokumu
efaf0ab22e feat: construct an account alias 2025-01-18 07:53:42 +03:00
Carlosokumu
e29bcb5b27 define and parse alias search domains 2025-01-18 07:52:08 +03:00
Carlosokumu
cdb22f8cbb add key for the account alias 2025-01-18 07:50:55 +03:00
lash
9cb9e02442 Merge branch 'master' into lash/update-dump 2025-01-17 18:56:43 +00:00
Carlosokumu
6aa4bd8906 add alias search domains 2025-01-17 15:02:58 +03: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
235 changed files with 5644 additions and 2405 deletions

16
.dockerignore Normal file
View File

@@ -0,0 +1,16 @@
/**
!/args
!/cmd/africastalking
!/cmd/ssh
!/config
!/debug
!/handlers
!/internal
!/profile
!/services
!/ssh
!/store
!/LICENSE
!/README.md
!/go.*
!/.env.example

View File

@@ -18,3 +18,13 @@ DATA_URL_BASE=http://localhost:5006
#Language
DEFAULT_LANGUAGE=eng
LANGUAGES=eng, swa
#Alias search domains
ALIAS_SEARCH_DOMAINS=sarafu.local, sarafu.eth
#Pool swap
DEFAULT_POOL_NAME="Kenya ROLA Pool"
DEFAULT_POOL_SYMBOL=ROLA
DEFAULT_POOL_CONTRACT_ADDRESS=0x48a953cA5cf5298bc6f6Af3C608351f537AAcb9e
DEFAULT_LIMITER_ADDRESS=
DEFAULT_VOUCHER_REGISTRY=

56
.github/workflows/docker.yaml vendored Normal file
View File

@@ -0,0 +1,56 @@
name: release
on:
push:
tags:
- "v*"
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Check out repo
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to GHCR Docker registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set outputs
run: |
echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV \
&& echo "RELEASE_SHORT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Build and push image
uses: docker/build-push-action@v2
with:
context: ./
file: ./Dockerfile
platforms: linux/amd64
push: true
build-args: |
BUILD=${{ env.RELEASE_SHORT_COMMIT }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
tags: |
ghcr.io/grassrootseconomics/sarafu-vise:latest
ghcr.io/grassrootseconomics/sarafu-vise:${{ env.RELEASE_TAG }}

47
Dockerfile Normal file
View File

@@ -0,0 +1,47 @@
FROM golang:1.23.4-bookworm AS build
ENV CGO_ENABLED=1
ARG BUILDPLATFORM
ARG TARGETPLATFORM
ARG BUILD=dev
WORKDIR /build
RUN apt-get update && apt-get install -y --no-install-recommends \
libgdbm-dev \
git \
&& rm -rf /var/lib/apt/lists/*
RUN git clone https://git.defalsify.org/vise.git go-vise
COPY . ./sarafu-vise
WORKDIR /build/sarafu-vise/services/registration
RUN echo "Compiling go-vise files"
RUN make VISE_PATH=/build/go-vise -B
WORKDIR /build/sarafu-vise
RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM"
RUN go mod download
RUN go build -tags logdebug,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
libgdbm-dev \
ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /service
COPY --from=build /build/sarafu-vise/sarafu-at .
COPY --from=build /build/sarafu-vise/LICENSE .
COPY --from=build /build/sarafu-vise/README.md .
COPY --from=build /build/sarafu-vise/services ./services
COPY --from=build /build/sarafu-vise/.env.example .
RUN mv .env.example .env
EXPOSE 7123
CMD ["./sarafu-at"]

View File

@@ -10,7 +10,7 @@ type LangVar struct {
v []lang.Language
}
func(lv *LangVar) Set(s string) error {
func (lv *LangVar) Set(s string) error {
v, err := lang.LanguageFromCode(s)
if err != nil {
return err
@@ -19,16 +19,14 @@ func(lv *LangVar) Set(s string) error {
return err
}
func(lv *LangVar) String() string {
func (lv *LangVar) String() string {
var s []string
for _, v := range(lv.v) {
for _, v := range lv.v {
s = append(s, v.Code)
}
return strings.Join(s, ",")
}
func(lv *LangVar) Langs() []lang.Language {
func (lv *LangVar) Langs() []lang.Language {
return lv.v
}

View File

@@ -12,18 +12,18 @@ import (
"syscall"
"git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/lang"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/visedriver/request"
at "git.grassecon.net/grassrootseconomics/visedriver-africastalking/africastalking"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
at "git.grassecon.net/grassrootseconomics/visedriver-africastalking/africastalking"
)
var (
@@ -36,8 +36,7 @@ var (
func main() {
config.LoadConfig()
var connStr string
var resourceDir string
override := config.NewOverride()
var size uint
var engineDebug bool
var host string
@@ -45,28 +44,29 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
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.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory")
flag.StringVar(&override.StateConn, "state", "?", "state store connection string")
flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host")
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
if connStr == "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
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()
ln, err := lang.LanguageFromCode(config.Language())
@@ -83,13 +83,14 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
cfg.EngineDebug = true
}
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err)
@@ -101,7 +102,11 @@ func main() {
fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err)
os.Exit(1)
}
defer userdataStore.Close()
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
@@ -115,13 +120,14 @@ func main() {
os.Exit(1)
}
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, "setdatastore: %v\n", err)
os.Exit(1)
}
accountService := services.New(ctx, menuStorageService, connData)
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, "httpaccountservice: %v\n", err)
@@ -133,10 +139,10 @@ func main() {
fmt.Fprintf(os.Stderr, "getstatestore: %v\n", err)
os.Exit(1)
}
defer stateStore.Close()
rp := &at.ATRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
bsh = bsh.WithEngineFunc(lhs.GetEngine)
sh := at.NewATRequestHandler(bsh)
mux := http.NewServeMux()
@@ -146,7 +152,10 @@ func main() {
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: mux,
}
s.RegisterOnShutdown(sh.Shutdown)
shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal)
cterm := make(chan os.Signal)

View File

@@ -1,12 +1,15 @@
package main
import (
"bufio"
"context"
"flag"
"fmt"
"io"
"os"
"os/signal"
"path"
"strings"
"syscall"
"git.defalsify.org/vise.git/engine"
@@ -14,12 +17,12 @@ import (
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/visedriver/request"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/visedriver/request"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
var (
@@ -44,9 +47,8 @@ func (p *asyncRequestParser) GetInput(r any) ([]byte, error) {
func main() {
config.LoadConfig()
var connStr string
override := config.NewOverride()
var sessionId string
var resourceDir string
var size uint
var engineDebug bool
var host string
@@ -54,28 +56,31 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir")
flag.StringVar(&connStr, "c", "", "connection string")
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory")
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.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host")
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
if connStr == "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
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()
@@ -93,13 +98,14 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
cfg.EngineDebug = true
}
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
menuStorageService := storage.NewMenuStorageService(conns)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
@@ -116,7 +122,13 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
defer userdataStore.Close()
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
//defer userdataStore.Close(ctx)
dbResource, ok := rs.(*resource.DbResource)
if !ok {
@@ -125,9 +137,9 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
accountService := services.New(ctx, menuStorageService, connData)
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
@@ -139,12 +151,14 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
defer stateStore.Close()
//defer stateStore.Close(ctx)
rp := &asyncRequestParser{
sessionId: sessionId,
}
sh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
sh = sh.WithEngineFunc(lhs.GetEngine)
cfg.SessionId = sessionId
rqs := request.RequestSession{
Ctx: ctx,
@@ -161,7 +175,7 @@ func main() {
case _ = <-cint:
case _ = <-cterm:
}
sh.Shutdown()
sh.Shutdown(ctx)
}()
for true {
@@ -177,18 +191,26 @@ func main() {
fmt.Errorf("error in output: %v", err)
os.Exit(1)
}
rqs, err = sh.Reset(rqs)
rqs, err = sh.Reset(ctx, rqs)
if err != nil {
logg.ErrorCtxf(ctx, "error in reset: %v", "err", err)
fmt.Errorf("error in reset: %v", err)
os.Exit(1)
}
fmt.Println("")
_, err = fmt.Scanln(&rqs.Input)
in := bufio.NewReader(os.Stdin)
s, err := in.ReadString('\n')
if err != nil {
if err == io.EOF {
logg.DebugCtxf(ctx, "have EOF, bailing")
break
}
logg.ErrorCtxf(ctx, "error in input", "err", err)
fmt.Errorf("error in input: %v", err)
os.Exit(1)
}
rqs.Input = []byte{}
s = strings.TrimSpace(s)
rqs.Input = []byte(s)
}
}

View File

@@ -17,13 +17,13 @@ import (
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
httprequest "git.grassecon.net/grassrootseconomics/visedriver/request/http"
"git.grassecon.net/grassrootseconomics/visedriver/request"
httprequest "git.grassecon.net/grassrootseconomics/visedriver/request/http"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
)
var (
@@ -35,8 +35,7 @@ var (
func main() {
config.LoadConfig()
var connStr string
var resourceDir string
override := config.NewOverride()
var size uint
var engineDebug bool
var host string
@@ -44,27 +43,30 @@ func main() {
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory")
flag.StringVar(&override.StateConn, "state", "?", "state store connection string")
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.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host")
flag.UintVar(&port, "p", config.Port(), "http port")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
if connStr == "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1)
}
logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size)
logg.Infof("start command", "conn", conns, "outputsize", size)
ctx := context.Background()
@@ -82,13 +84,14 @@ func main() {
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
ResetOnEmptyInput: true,
}
if engineDebug {
cfg.EngineDebug = true
}
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx)
if err != nil {
@@ -101,7 +104,12 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
defer userdataStore.Close()
logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
@@ -110,14 +118,15 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore)
lhs.SetLogDb(&logdb)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
accountService := services.New(ctx, menuStorageService, connData)
accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
@@ -129,18 +138,21 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
defer stateStore.Close()
//accountService := services.New(ctx, menuStorageService, connData)
rp := &httprequest.DefaultRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
bsh = bsh.WithEngineFunc(lhs.GetEngine)
sh := httprequest.NewHTTPRequestHandler(bsh)
s := &http.Server{
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: sh,
}
s.RegisterOnShutdown(sh.Shutdown)
shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal)
cterm := make(chan os.Signal)

View File

@@ -5,17 +5,19 @@ import (
"flag"
"fmt"
"os"
"os/signal"
"path"
"syscall"
"git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/lang"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/resource"
"git.defalsify.org/vise.git/lang"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/sarafu-vise/args"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers"
"git.grassecon.net/grassrootseconomics/sarafu-vise/services"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
var (
@@ -27,41 +29,41 @@ var (
func main() {
config.LoadConfig()
var connStr string
override := config.NewOverride()
var size uint
var sessionId string
var engineDebug bool
var resourceDir string
var err error
var gettextDir string
var langs args.LangVar
var logDbConnStr string
flag.StringVar(&resourceDir, "resourcedir", scriptDir, "resource dir")
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(&override.ResourceConn, "resource", "?", "resource data directory")
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.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language")
flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string")
flag.Parse()
if connStr == "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
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)
}
logg.Infof("start command", "conn", connData, "outputsize", size)
logg.Infof("start command", "conn", conns, "outputsize", size)
if len(langs.Langs()) == 0 {
langs.Set(config.Language())
}
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
ln, err := lang.LanguageFromCode(config.Language())
if err != nil {
@@ -73,19 +75,21 @@ func main() {
pfp := path.Join(scriptDir, "pp.csv")
cfg := engine.Config{
Root: "root",
SessionId: sessionId,
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
Root: "root",
SessionId: sessionId,
OutputSize: uint32(size),
FlagCount: uint32(128),
MenuSeparator: menuSeparator,
EngineDebug: engineDebug,
ResetOnEmptyInput: true,
}
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
menuStorageService := storage.NewMenuStorageService(conns)
if err != nil {
fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err)
os.Exit(1)
}
if gettextDir != "" {
menuStorageService = menuStorageService.WithGettext(gettextDir, langs.Langs())
}
@@ -108,6 +112,12 @@ func main() {
os.Exit(1)
}
logdb, err := menuStorageService.GetLogDb(ctx, userdatastore, logDbConnStr, "user-data")
if err != nil {
fmt.Fprintf(os.Stderr, "get log db error: %v\n", err)
os.Exit(1)
}
dbResource, ok := rs.(*resource.DbResource)
if !ok {
fmt.Fprintf(os.Stderr, "get dbresource error: %v\n", err)
@@ -116,24 +126,35 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdatastore)
lhs.SetLogDb(&logdb)
lhs.SetPersister(pe)
if err != nil {
fmt.Fprintf(os.Stderr, "localhandler service error: %v\n", err)
os.Exit(1)
}
accountService := services.New(ctx, menuStorageService, connData)
hl, err := lhs.GetHandler(accountService)
accountService := services.New(ctx, menuStorageService)
_, err = lhs.GetHandler(accountService)
if err != nil {
fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err)
os.Exit(1)
}
en := lhs.GetEngine(cfg, rs, pe)
en := lhs.GetEngine()
en = en.WithFirst(hl.Init)
if engineDebug {
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() {
var s os.Signal
select {
case s = <-cterm:
case s = <-cint:
}
logg.InfoCtxf(ctx, "stopping on signal", "sig", s)
en.Finish(ctx)
os.Exit(0)
}()
err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil)
if err != nil {

View File

@@ -31,34 +31,31 @@ var (
func main() {
config.LoadConfig()
var connStr string
override := config.NewOverride()
var authConnStr string
var resourceDir string
var size uint
var engineDebug bool
var stateDebug bool
var host string
var port uint
flag.StringVar(&connStr, "c", "", "connection string")
flag.StringVar(&authConnStr, "authdb", "", "auth connection string")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir")
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.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.HostSSH(), "socket host")
flag.UintVar(&port, "p", config.PortSSH(), "socket port")
flag.Parse()
if connStr == "" {
connStr = config.DbConn()
}
if authConnStr == "" {
authConnStr = connStr
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1)
}
authConnData, err := storage.ToConnData(authConnStr)
if err != nil {
fmt.Fprintf(os.Stderr, "auth connstr err: %v", err)
@@ -79,7 +76,7 @@ func main() {
logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!")
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")
@@ -87,6 +84,7 @@ func main() {
Root: "root",
OutputSize: uint32(size),
FlagCount: uint32(128),
ResetOnEmptyInput: true,
}
if stateDebug {
cfg.StateDebug = true
@@ -102,7 +100,7 @@ func main() {
}
defer func() {
logg.TraceCtxf(ctx, "shutdown auth key store reached")
err = authKeyStore.Close()
err = authKeyStore.Close(ctx)
if err != nil {
logg.ErrorCtxf(ctx, "keystore close error", "err", err)
}
@@ -114,14 +112,13 @@ func main() {
signal.Notify(cterm, os.Interrupt, syscall.SIGTERM)
runner := &ssh.SshRunner{
Cfg: cfg,
Debug: engineDebug,
FlagFile: pfp,
Conn: connData,
ResourceDir: resourceDir,
SrvKeyFile: sshKeyFile,
Host: host,
Port: port,
Cfg: cfg,
Debug: engineDebug,
FlagFile: pfp,
Conn: conns,
SrvKeyFile: sshKeyFile,
Host: host,
Port: port,
}
go func() {
select {

View File

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

20
config/args.go Normal file
View File

@@ -0,0 +1,20 @@
package config
import (
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
func NewOverride() *viseconfig.Override {
o := &viseconfig.Override{
StateConnMode: storage.DBMODE_TEXT,
ResourceConnMode: storage.DBMODE_TEXT,
UserConnMode: storage.DBMODE_BINARY,
}
return o
}
func Apply(o *viseconfig.Override) error {
viseconfig.ApplyConn(o)
return nil
}

View File

@@ -1,24 +1,36 @@
package config
import (
"git.grassecon.net/grassrootseconomics/visedriver/env"
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
"strings"
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
"git.grassecon.net/grassrootseconomics/visedriver/env"
)
func init() {
env.LoadEnvVariables()
var (
GetConns = viseconfig.GetConns
EnvPath string
)
func loadEnv() {
if EnvPath == "" {
env.LoadEnvVariables()
} else {
env.LoadEnvVariablesPath(EnvPath)
}
}
const (
defaultSSHHost string = "127.0.0.1"
defaultSSHPort uint = 7122
defaultSSHHost string = "127.0.0.1"
defaultSSHPort uint = 7122
defaultHTTPHost string = "127.0.0.1"
defaultHTTPPort uint = 7123
defaultHTTPPort uint = 7123
defaultDomain = "sarafu.local"
)
func LoadConfig() error {
loadEnv()
err := viseconfig.LoadConfig()
if err != nil {
return err
@@ -30,8 +42,14 @@ func LoadConfig() error {
return nil
}
func DbConn() string {
return viseconfig.DbConn
func SearchDomains() []string {
var ParsedDomains []string
SearchDomains := env.GetEnv("ALIAS_SEARCH_DOMAINS", defaultDomain)
SearchDomainList := strings.Split(env.GetEnv("ALIAS_SEARCH_DOMAINS", SearchDomains), ",")
for _, domain := range SearchDomainList {
ParsedDomains = append(ParsedDomains, strings.ReplaceAll(domain, " ", ""))
}
return ParsedDomains
}
func Language() string {
@@ -57,3 +75,15 @@ func PortSSH() uint {
func ATEndpoint() string {
return env.GetEnv("AT_ENDPOINT", "/")
}
func DefaultPoolAddress() string {
return env.GetEnv("DEFAULT_POOL_CONTRACT_ADDRESS", "")
}
func DefaultPoolName() string {
return env.GetEnv("DEFAULT_POOL_NAME", "")
}
func DefaultPoolSymbol() string {
return env.GetEnv("DEFAULT_POOL_SYMBOL", "")
}

View File

@@ -1,11 +1,11 @@
package debug
import (
"fmt"
"encoding/binary"
"fmt"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
visedb "git.defalsify.org/vise.git/db"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
@@ -13,10 +13,10 @@ var (
)
type KeyInfo struct {
SessionId string
Typ uint8
SubTyp storedb.DataTyp
Label string
SessionId string
Typ uint8
SubTyp storedb.DataTyp
Label string
Description string
}
@@ -32,18 +32,10 @@ func (k KeyInfo) String() string {
func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o := KeyInfo{}
b := []byte(sessionId)
if len(k) <= len(b) {
return o, fmt.Errorf("storage key missing")
}
o.SessionId = sessionId
o.Typ = uint8(k[0])
k = k[1:]
o.SessionId = string(k[:len(b)])
k = k[len(b):]
if o.Typ == visedb.DATATYPE_USERDATA {
if len(k) == 0 {
@@ -53,30 +45,19 @@ func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o.SubTyp = storedb.DataTyp(v)
o.Label = subTypToString(o.SubTyp)
k = k[2:]
if len(k) != 0 {
return o, fmt.Errorf("excess key information: %x", k)
}
} else {
o.Label = typToString(o.Typ)
}
if len(k) != 0 {
return o, fmt.Errorf("excess key information")
k = k[2:]
}
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 {
return dbTypStr[v + visedb.DATATYPE_USERDATA + 1]
return dbTypStr[v+visedb.DATATYPE_USERDATA+1]
}
func typToString(v uint8) string {

View File

@@ -1,3 +1,4 @@
//go:build debugdb
// +build debugdb
package debug
@@ -11,34 +12,37 @@ import (
func init() {
DebugCap |= 1
dbTypStr[db.DATATYPE_STATE] = "internal state"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TRACKING_ID] = "tracking id"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_PUBLIC_KEY] = "public key"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACCOUNT_PIN] = "account pin"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_FIRST_NAME] = "first name"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_FAMILY_NAME] = "family name"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_YOB] = "year of birth"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_LOCATION] = "location"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_GENDER] = "gender"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_OFFERINGS] = "offerings"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_RECIPIENT] = "recipient"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_AMOUNT] = "amount"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TEMPORARY_VALUE] = "temporary value"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_SYM] = "active sym"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_BAL] = "active bal"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_BLOCKED_NUMBER] = "blocked number"
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_ADDRESS] = "active address"
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_DECIMALS] = "voucher decimals"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_ADDRESSES] = "voucher addresses"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_SENDERS] = "tx senders"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_RECIPIENTS] = "tx recipients"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_VALUES] = "tx values"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_ADDRESSES] = "tx addresses"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_HASHES] = "tx hashes"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_DATES] = "tx dates"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_SYMBOLS] = "tx symbols"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_TX_DECIMALS] = "tx decimals"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TRACKING_ID] = "tracking id"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_PUBLIC_KEY] = "public key"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_ACCOUNT_PIN] = "account pin"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_FIRST_NAME] = "first name"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_FAMILY_NAME] = "family name"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_YOB] = "year of birth"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_LOCATION] = "location"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_GENDER] = "gender"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_OFFERINGS] = "offerings"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_RECIPIENT] = "recipient"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_AMOUNT] = "amount"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TEMPORARY_VALUE] = "temporary value"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_ACTIVE_SYM] = "active sym"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_ACTIVE_BAL] = "active bal"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_BLOCKED_NUMBER] = "blocked number"
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_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_BALANCES] = "voucher balances"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_VOUCHER_DECIMALS] = "voucher decimals"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_VOUCHER_ADDRESSES] = "voucher addresses"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_SENDERS] = "tx senders"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_RECIPIENTS] = "tx recipients"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_VALUES] = "tx values"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_ADDRESSES] = "tx addresses"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_HASHES] = "tx hashes"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_DATES] = "tx dates"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_SYMBOLS] = "tx symbols"
dbTypStr[db.DATATYPE_USERDATA+1+storedb.DATA_TX_DECIMALS] = "tx decimals"
}

View File

@@ -3,14 +3,13 @@ package debug
import (
"testing"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
visedb "git.defalsify.org/vise.git/db"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
func TestDebugDbSubKeyInfo(t *testing.T) {
s := "foo"
b := []byte{0x20}
b = append(b, []byte(s)...)
b = append(b, []byte{0x00, 0x02}...)
r, err := ToKeyInfo(b, s)
if err != nil {
@@ -25,7 +24,7 @@ func TestDebugDbSubKeyInfo(t *testing.T) {
if r.SubTyp != 2 {
t.Fatalf("expected 2, got %d", r.SubTyp)
}
if DebugCap & 1 > 0 {
if DebugCap&1 > 0 {
if r.Label != "tracking id" {
t.Fatalf("expected 'tracking id', got '%s'", r.Label)
}
@@ -46,7 +45,7 @@ func TestDebugDbKeyInfo(t *testing.T) {
if r.Typ != 16 {
t.Fatalf("expected 16, got %d", r.Typ)
}
if DebugCap & 1 > 0 {
if DebugCap&1 > 0 {
if r.Label != "internal state" {
t.Fatalf("expected 'internal_state', got '%s'", r.Label)
}
@@ -56,7 +55,6 @@ func TestDebugDbKeyInfo(t *testing.T) {
func TestDebugDbKeyInfoRestore(t *testing.T) {
s := "bar"
b := []byte{visedb.DATATYPE_USERDATA}
b = append(b, []byte(s)...)
k := storedb.ToBytes(storedb.DATA_ACTIVE_SYM)
b = append(b, k...)
@@ -70,7 +68,7 @@ func TestDebugDbKeyInfoRestore(t *testing.T) {
if r.Typ != 32 {
t.Fatalf("expected 32, got %d", r.Typ)
}
if DebugCap & 1 > 0 {
if DebugCap&1 > 0 {
if r.Label != "active sym" {
t.Fatalf("expected 'active sym', got '%s'", r.Label)
}

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 (
"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/sarafu-vise/handlers/application"
"git.grassecon.net/grassrootseconomics/sarafu-vise/internal/cmd"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
var (
logg = logging.NewVanilla().WithContextKey("SessionId")
scriptDir = path.Join("services", "registration")
)
func main() {
ctx := context.Background()
err := commands.Seed(ctx)
config.LoadConfig()
override := config.NewOverride()
var sessionId string
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 data directory")
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 {
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()
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

@@ -8,18 +8,17 @@ import (
"path"
"strings"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/lang"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/config"
)
const (
changeHeadSrc = `LOAD reset_account_authorized 0
LOAD reset_incorrect 0
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0
`
`
selectSrc = `LOAD set_language 6
RELOAD set_language
@@ -29,8 +28,8 @@ MOVE language_changed
)
var (
logg = logging.NewVanilla()
mouts string
logg = logging.NewVanilla()
mouts string
incmps string
)
@@ -63,7 +62,7 @@ func main() {
}
logg.Tracef("using languages", "lang", config.Languages)
for i, v := range(config.Languages) {
for i, v := range config.Languages {
ln, err := lang.LanguageFromCode(v)
if err != nil {
fmt.Fprintf(os.Stderr, "error parsing language: %s\n", v)
@@ -76,7 +75,7 @@ func main() {
incmps += fmt.Sprintf("INCMP %s %v\n", v, n)
p := path.Join(srcDir, v)
w, err := os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_EXCL, 0600)
w, err := os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
if err != nil {
fmt.Fprintf(os.Stderr, "failed open language set template output: %v\n", err)
os.Exit(1)
@@ -93,7 +92,7 @@ func main() {
src += "INCMP . *\n"
p := path.Join(srcDir, "select_language.vis")
w, err := os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_EXCL, 0600)
w, err := os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
if err != nil {
fmt.Fprintf(os.Stderr, "failed open select language vis output: %v\n", err)
os.Exit(1)
@@ -107,7 +106,7 @@ func main() {
src = changeHeadSrc + src
p = path.Join(srcDir, "change_language.vis")
w, err = os.OpenFile(p, os.O_WRONLY | os.O_CREATE | os.O_EXCL, 0600)
w, err = os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
if err != nil {
fmt.Fprintf(os.Stderr, "failed open select language vis output: %v\n", err)
os.Exit(1)

View File

@@ -7,11 +7,11 @@ import (
"os"
"path"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/debug"
"git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/debug"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
var (
@@ -19,55 +19,58 @@ var (
scriptDir = path.Join("services", "registration")
)
func formatItem(k []byte, v []byte) (string, error) {
o, err := debug.FromKey(k)
func formatItem(k []byte, v []byte, sessionId string) (string, error) {
o, err := debug.ToKeyInfo(k, sessionId)
if err != nil {
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
}
func main() {
config.LoadConfig()
var connStr string
override := config.NewOverride()
var sessionId string
var database string
var engineDebug bool
var err error
var first bool
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 data directory")
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.Parse()
if connStr != "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
config.Apply(override)
conns, err := config.GetConns()
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1)
}
logg.Infof("start command", "conn", connData)
logg.Infof("start command", "conn", conns)
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
ctx = context.WithValue(ctx, "Database", database)
resourceDir := scriptDir
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
menuStorageService := storage.NewMenuStorageService(conns)
store, err := menuStorageService.GetUserdataDb(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "get userdata db: %v\n", err.Error())
os.Exit(1)
}
store.SetSession(sessionId)
store.SetPrefix(db.DATATYPE_USERDATA)
d, err := store.Dump(ctx, []byte(sessionId))
d, err := store.Dump(ctx, []byte(""))
if err != nil {
fmt.Fprintf(os.Stderr, "store dump fail: %v\n", err.Error())
os.Exit(1)
@@ -78,15 +81,19 @@ func main() {
if k == nil {
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 {
fmt.Fprintf(os.Stderr, "format db item error: %v", err)
fmt.Fprintf(os.Stderr, "format db item error: %v\n", err)
os.Exit(1)
}
fmt.Printf(r)
}
err = store.Close()
err = store.Close(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
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)
}
}

38
go.mod
View File

@@ -3,14 +3,14 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise
go 1.23.4
require (
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d
git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250517114512-050998ff82b1
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694
github.com/alecthomas/assert/v2 v2.2.2
github.com/gofrs/uuid v4.4.0+incompatible
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta
github.com/grassrootseconomics/ussd-data-service v1.4.4-beta
github.com/jackc/pgx/v5 v5.7.1
github.com/peteole/testdata-loader v0.3.0
github.com/stretchr/testify v1.9.0
@@ -19,24 +19,50 @@ require (
)
require (
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/alecthomas/participle/v2 v2.0.0 // indirect
github.com/alecthomas/repr v0.2.0 // indirect
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c // indirect
github.com/bits-and-blooms/bitset v1.14.3 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect
github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
github.com/ethereum/go-ethereum v1.14.9 // indirect
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/grassrootseconomics/eth-custodial v1.3.0-beta // indirect
github.com/grassrootseconomics/ethutils v1.3.1 // indirect
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/holiman/uint256 v1.3.1 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/joho/godotenv v1.5.1 // indirect
github.com/lmittmann/w3 v0.17.1 // indirect
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/supranational/blst v0.3.11 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/x448/float16 v0.8.4 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.7.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
)

92
go.sum
View File

@@ -1,13 +1,25 @@
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739 h1:w7pj1oh7jXrfajahVYU7m7AfHst4C6jNVzDVoaqJ7e8=
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739/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-20250113174703-6afccefd1f05/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f h1:FgccQi8vipX6dUt+GRiRDYHMR3UqC+plz73vw7y3fyU=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f/go.mod h1:tbA4whUGMUIDgQVdIW0sxWPuuXOvZRSny5zeku5hX4k=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63 h1:bX7klKZpX+ZZu1LKbtOXDAhV/KK0YwExehiIi0jusAM=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63/go.mod h1:Syw9TZyigPAM7t9FvicOm36iUnidt45f0SxzT2JniQ8=
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-20250113103030-f0b2056fd87d/go.mod h1:AH15xABcvaJr1TCGlih3oGSuwWC0E5IdbHQwuu+E1KI=
git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk=
git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9 h1:4kjbYw25MHZe9fqSbujPzpFXrYutFfVipvLrcWYnYks=
git.defalsify.org/vise.git v0.3.2-0.20250507172020-cb22240f1cb9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc=
git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f h1:OAHCP3YR1C5h1WFnnEnLs5kn6jTxQHQYWYtQaMZJIMY=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250516094326-3b85167ad84a h1:QNh0NaKtGbSeRPlTVKEAnqc0R5rnVrpDMrCHD/EaU5U=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250516094326-3b85167ad84a/go.mod h1:K/TPgZ4OhPHBQq2X0ab3JZs4YjiexzSURZcfHLs9Pf4=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250517113706-ee434dba6980 h1:FQUwTDFWduY7gCMi1U2OiFlsuAHLojWUw2hvZ4cGC2s=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250517113706-ee434dba6980/go.mod h1:K/TPgZ4OhPHBQq2X0ab3JZs4YjiexzSURZcfHLs9Pf4=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250517114512-050998ff82b1 h1:0hvILlGkZnXO8o7nZth4xu77vAS4zVQ6Ae0rb5x/Idg=
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250517114512-050998ff82b1/go.mod h1:K/TPgZ4OhPHBQq2X0ab3JZs4YjiexzSURZcfHLs9Pf4=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4=
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g=
@@ -16,21 +28,58 @@ github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk
github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
github.com/bits-and-blooms/bitset v1.14.3 h1:Gd2c8lSNf9pKXom5JtD7AaKO8o7fGQ2LtFj1436qilA=
github.com/bits-and-blooms/bitset v1.14.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
github.com/ethereum/go-ethereum v1.14.9 h1:J7iwXDrtUyE9FUjUYbd4c9tyzwMh6dTJsKzo9i6SrwA=
github.com/ethereum/go-ethereum v1.14.9/go.mod h1:QeW+MtTpRdBEm2pUFoonByee8zfHv7kGp0wK0odvU1I=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88=
github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grassrootseconomics/eth-custodial v1.3.0-beta h1:twrMBhl89GqDUL9PlkzQxMP/6OST1BByrNDj+rqXDmU=
github.com/grassrootseconomics/eth-custodial v1.3.0-beta/go.mod h1:7uhRcdnJplX4t6GKCEFkbeDhhjlcaGJeJqevbcvGLZo=
github.com/grassrootseconomics/ethutils v1.3.1 h1:LlQO90HjJkl7ejC8fv6jP7RJUrAm1j4VMMCYfsoIrhU=
github.com/grassrootseconomics/ethutils v1.3.1/go.mod h1:Wuv1VEZrkLIXqTSEYI3Nh9HG/ZHOUQ+U+xvWJ8QtjgQ=
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta h1:fn1gwbWIwHVEBtUC2zi5OqTlfI/5gU1SMk0fgGixIXk=
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta/go.mod h1:omfI0QtUwIdpu9gMcUqLMCG8O1XWjqJGBx1qUMiGWC0=
github.com/grassrootseconomics/ussd-data-service v1.4.0-beta h1:4fMd/3h2ZIhRg4GdHQmRw5FfD3MpJvFNNJQo+Q27f5M=
github.com/grassrootseconomics/ussd-data-service v1.4.0-beta/go.mod h1:9sGnorpKaK76FmOGXoh/xv7x5siSFNYdXxQo9BKW4DI=
github.com/grassrootseconomics/ussd-data-service v1.4.4-beta h1:turlyo0i3OLj29mWpWNoB/3Qao8qEngT/5d1jDWTZE4=
github.com/grassrootseconomics/ussd-data-service v1.4.4-beta/go.mod h1:9sGnorpKaK76FmOGXoh/xv7x5siSFNYdXxQo9BKW4DI=
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4 h1:U4kkNYryi/qfbBF8gh7Vsbuz+cVmhf5kt6pE9bYYyLo=
github.com/graygnuorg/go-gdbm v0.0.0-20220711140707-71387d66dce4/go.mod h1:zpZDgZFzeq9s0MIeB1P50NIEWDFFHSFBohI/NbaTD/Y=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs=
github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
@@ -45,8 +94,13 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lmittmann/w3 v0.17.1 h1:zdXIimmNmYfqOFur+Jqc9Yqwtq6jwnsQufbTOnSAtW4=
github.com/lmittmann/w3 v0.17.1/go.mod h1:WVUGMbL83WYBu4Sge3SVlW3qIG4VaHe+S8+UUnwz9Eg=
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a h1:0Q3H0YXzMHiciXtRcM+j0jiCe8WKPQHoRgQiRTnfcLY=
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a/go.mod h1:CdTTBOYzS5E4mWS1N8NWP6AHI19MP0A2B18n3hLzRMk=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/pashagolub/pgxmock/v4 v4.3.0 h1:DqT7fk0OCK6H0GvqtcMsLpv8cIwWqdxWgfZNLeHCb/s=
github.com/pashagolub/pgxmock/v4 v4.3.0/go.mod h1:9VoVHXwS3XR/yPtKGzwQvwZX1kzGB9sM8SviDcHDa3A=
github.com/peteole/testdata-loader v0.3.0 h1:8jckE9KcyNHgyv/VPoaljvKZE0Rqr8+dPVYH6rfNr9I=
@@ -56,6 +110,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
@@ -63,18 +119,32 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -83,3 +153,5 @@ gopkg.in/leonelquinteros/gotext.v1 v1.3.1/go.mod h1:X1WlGDeAFIYsW6GjgMm4VwUwZ2Xj
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -35,13 +35,6 @@ func (eu *EventsUpdater) HandleCustodialRegistration(ctx context.Context, ev *ap
if err != nil {
return err
}
// err = pe.Load(identity.SessionId)
// if err != nil {
// return err
// }
// st := pe.GetState()
// st.SetFlag(accountCreatedFlag)
// return pe.Save(identity.SessionId)
logg.DebugCtxf(ctx, "received custodial registration event", "identity", identity)
return nil
}

View File

@@ -4,12 +4,12 @@ import (
"context"
"fmt"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.defalsify.org/vise.git/persist"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
var (
@@ -17,9 +17,9 @@ var (
)
type EventsUpdater struct {
api remote.AccountService
api remote.AccountService
formatFunc func(string, int, any) string
store storage.StorageService
store storage.StorageService
}
func NewEventsUpdater(api remote.AccountService, store storage.StorageService) *EventsUpdater {

View File

@@ -6,13 +6,13 @@ import (
"strings"
"git.defalsify.org/vise.git/db"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"git.grassecon.net/grassrootseconomics/common/identity"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
// execute all
// execute all
func (eu *EventsUpdater) updateToken(ctx context.Context, identity identity.Identity, userStore *store.UserDataStore, tokenAddress string) error {
err := eu.updateTokenList(ctx, identity, userStore)
if err != nil {
@@ -47,19 +47,16 @@ func (eu *EventsUpdater) updateToken(ctx context.Context, identity identity.Iden
return nil
}
// set default token to given symbol.
func (eu *EventsUpdater) updateDefaultToken(ctx context.Context, identity identity.Identity, userStore *store.UserDataStore, activeSym string) error {
pfxDb := toPrefixDb(userStore, identity.SessionId)
// TODO: the activeSym input should instead be newline separated list?
tokenData, err := store.GetVoucherData(ctx, pfxDb, activeSym)
tokenData, err := store.GetVoucherData(ctx, userStore, identity.SessionId, activeSym)
if err != nil {
return err
}
return store.UpdateVoucherData(ctx, userStore, identity.SessionId, tokenData)
}
// handle token transfer.
//
// if from and to are NOT the same, handle code will be executed once for each side of the transfer.
@@ -189,7 +186,7 @@ func (eu *EventsUpdater) updateTokenTransferList(ctx context.Context, identity i
return err
}
for i, tx := range(txs) {
for i, tx := range txs {
r = append(r, eu.formatFunc(apievent.EventTokenTransferTag, i, tx))
}

View File

@@ -4,55 +4,49 @@ import (
"context"
"strings"
"git.defalsify.org/vise.git/asm"
"git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
)
var (
logg = logging.NewVanilla().WithDomain("sarafu-vise.engine")
)
type HandlerService interface {
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 {
Parser *asm.FlagParser
Parser *application.FlagManager
DbRs *resource.DbResource
Pe *persist.Persister
UserdataStore *db.Db
AdminStore *store.AdminStore
LogDb *db.Db
Cfg engine.Config
Rs resource.Resource
first resource.EntryFunc
}
func NewLocalHandlerService(ctx context.Context, fp string, debug bool, dbResource *resource.DbResource, cfg engine.Config, rs resource.Resource) (*LocalHandlerService, error) {
parser, err := getParser(fp, debug)
parser, err := application.NewFlagManager(fp)
if err != nil {
return nil, err
}
adminstore, err := store.NewAdminStore(ctx, "admin_numbers")
if err != nil {
return nil, err
if debug {
parser.SetDebug()
}
return &LocalHandlerService{
Parser: parser,
DbRs: dbResource,
AdminStore: adminstore,
Cfg: cfg,
Rs: rs,
Parser: parser,
DbRs: dbResource,
Cfg: cfg,
Rs: rs,
}, nil
}
@@ -64,17 +58,21 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) {
ls.UserdataStore = db
}
func (ls *LocalHandlerService) SetLogDb(db *db.Db) {
ls.LogDb = db
}
func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) (*application.MenuHandlers, error) {
replaceSeparatorFunc := func(input string) string {
return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator)
}
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, ls.AdminStore, accountService, replaceSeparatorFunc)
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, *ls.LogDb, accountService, replaceSeparatorFunc)
if err != nil {
return nil, err
}
//appHandlers = appHandlers.WithPersister(ls.Pe)
appHandlers.SetPersister(ls.Pe)
ls.DbRs.AddLocalFunc("check_blocked_status", appHandlers.CheckBlockedStatus)
ls.DbRs.AddLocalFunc("set_language", appHandlers.SetLanguage)
ls.DbRs.AddLocalFunc("create_account", appHandlers.CreateAccount)
ls.DbRs.AddLocalFunc("save_temporary_pin", appHandlers.SaveTemporaryPin)
@@ -106,23 +104,18 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("verify_yob", appHandlers.VerifyYob)
ls.DbRs.AddLocalFunc("reset_incorrect_date_format", appHandlers.ResetIncorrectYob)
ls.DbRs.AddLocalFunc("initiate_transaction", appHandlers.InitiateTransaction)
ls.DbRs.AddLocalFunc("verify_new_pin", appHandlers.VerifyNewPin)
ls.DbRs.AddLocalFunc("confirm_pin_change", appHandlers.ConfirmPinChange)
ls.DbRs.AddLocalFunc("quit_with_help", appHandlers.QuitWithHelp)
ls.DbRs.AddLocalFunc("fetch_community_balance", appHandlers.FetchCommunityBalance)
ls.DbRs.AddLocalFunc("set_default_voucher", appHandlers.SetDefaultVoucher)
ls.DbRs.AddLocalFunc("check_vouchers", appHandlers.CheckVouchers)
ls.DbRs.AddLocalFunc("manage_vouchers", appHandlers.ManageVouchers)
ls.DbRs.AddLocalFunc("get_vouchers", appHandlers.GetVoucherList)
ls.DbRs.AddLocalFunc("view_voucher", appHandlers.ViewVoucher)
ls.DbRs.AddLocalFunc("set_voucher", appHandlers.SetVoucher)
ls.DbRs.AddLocalFunc("get_voucher_details", appHandlers.GetVoucherDetails)
ls.DbRs.AddLocalFunc("reset_valid_pin", appHandlers.ResetValidPin)
ls.DbRs.AddLocalFunc("check_pin_mismatch", appHandlers.CheckBlockedNumPinMisMatch)
ls.DbRs.AddLocalFunc("validate_blocked_number", appHandlers.ValidateBlockedNumber)
ls.DbRs.AddLocalFunc("retrieve_blocked_number", appHandlers.RetrieveBlockedNumber)
ls.DbRs.AddLocalFunc("reset_unregistered_number", appHandlers.ResetUnregisteredNumber)
ls.DbRs.AddLocalFunc("reset_others_pin", appHandlers.ResetOthersPin)
ls.DbRs.AddLocalFunc("save_others_temporary_pin", appHandlers.SaveOthersTemporaryPin)
ls.DbRs.AddLocalFunc("get_current_profile_info", appHandlers.GetCurrentProfileInfo)
ls.DbRs.AddLocalFunc("check_transactions", appHandlers.CheckTransactions)
ls.DbRs.AddLocalFunc("get_transactions", appHandlers.GetTransactionsList)
@@ -130,13 +123,30 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService)
ls.DbRs.AddLocalFunc("update_all_profile_items", appHandlers.UpdateAllProfileItems)
ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack)
ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount)
ls.DbRs.AddLocalFunc("clear_temporary_value", appHandlers.ClearTemporaryValue)
ls.DbRs.AddLocalFunc("reset_invalid_pin", appHandlers.ResetInvalidPIN)
ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias)
ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias)
ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias)
ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated)
ls.DbRs.AddLocalFunc("reset_api_call_failure", appHandlers.ResetApiCallFailure)
ls.DbRs.AddLocalFunc("swap_to_list", appHandlers.LoadSwapToList)
ls.DbRs.AddLocalFunc("swap_max_limit", appHandlers.SwapMaxLimit)
ls.DbRs.AddLocalFunc("swap_preview", appHandlers.SwapPreview)
ls.DbRs.AddLocalFunc("initiate_swap", appHandlers.InitiateSwap)
ls.first = appHandlers.Init
return appHandlers, nil
}
// TODO: enable setting of sessionId on engine init time
func (ls *LocalHandlerService) GetEngine() *engine.DefaultEngine {
en := engine.NewEngine(ls.Cfg, ls.Rs)
en = en.WithPersister(ls.Pe)
func (ls *LocalHandlerService) GetEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
en := engine.NewEngine(cfg, rs)
if ls.first != nil {
en = en.WithFirst(ls.first)
}
en = en.WithPersister(pr)
if cfg.EngineDebug {
en = en.WithDebug(nil)
}
return en
}

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

@@ -0,0 +1,96 @@
package cmd
import (
"context"
"fmt"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
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)
}

96
internal/sms/sms.go Normal file
View File

@@ -0,0 +1,96 @@
package sms
import (
"context"
"fmt"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/common/phone"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
logg = logging.NewVanilla().WithDomain("smsservice")
)
type SmsService struct {
Accountservice remote.AccountService
Userdatastore store.UserDataStore
}
// SendUpsellSMS will send an invitation SMS to an unregistered phone number
func (smsservice *SmsService) SendUpsellSMS(ctx context.Context, inviterPhone, inviteePhone string) error {
if !phone.IsValidPhoneNumber(inviterPhone) {
return fmt.Errorf("invalid inviter phone number %v", inviterPhone)
}
if !phone.IsValidPhoneNumber(inviteePhone) {
return fmt.Errorf("Invalid invitee phone number %v", inviteePhone)
}
_, err := smsservice.Accountservice.SendUpsellSMS(ctx, inviterPhone, inviteePhone)
if err != nil {
return fmt.Errorf("Failed to send upsell sms: %v", err)
}
return nil
}
// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset.
func (smsService *SmsService) SendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error {
formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format admin phone number: %w", err)
}
formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber)
if err != nil {
return fmt.Errorf("failed to format blocked phone number: %w", err)
}
if !phone.IsValidPhoneNumber(formattedAdminPhone) {
return fmt.Errorf("invalid admin phone number")
}
if !phone.IsValidPhoneNumber(formattedBlockedPhone) {
return fmt.Errorf("invalid blocked phone number")
}
err = smsService.Accountservice.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone)
if err != nil {
return fmt.Errorf("failed to send pin reset sms: %v", err)
}
return nil
}
// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber.
func (smsService *SmsService) SendAddressSMS(ctx context.Context) error {
store := smsService.Userdatastore
sessionId, ok := ctx.Value("SessionId").(string)
if !ok {
return fmt.Errorf("missing session")
}
publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY)
if err != nil {
logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err)
return err
}
originPhone, err := phone.FormatPhoneNumber(sessionId)
if err != nil {
logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId)
return nil
}
if !phone.IsValidPhoneNumber(originPhone) {
logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone)
return fmt.Errorf("invalid origin phone number")
}
err = smsService.Accountservice.SendAddressSMS(ctx, string(publicKey), originPhone)
if err != nil {
logg.DebugCtxf(ctx, "Failed to send address sms", "error", err)
return fmt.Errorf("Failed to send address sms: %v", err)
}
return nil
}

View File

@@ -1,5 +1,67 @@
{
"groups": [
{
"name": "main_my_vouchers_select_voucher_using_index",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "2",
"expectedContent": "My vouchers\n1:Select voucher\n2:Voucher details\n0:Back"
},
{
"input": "1",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "1",
"expectedContent": "Enter PIN to confirm selection:\nSymbol: SRF\nBalance: 2.745987\n0:Back\n9:Quit"
},
{
"input": "1234",
"expectedContent": "Success! SRF is now your active voucher.\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "main_my_vouchers_select_voucher_using_symbol",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "2",
"expectedContent": "My vouchers\n1:Select voucher\n2:Voucher details\n0:Back"
},
{
"input": "1",
"expectedContent": "Select number or symbol from your vouchers:\n1SRF\n0:Back\n99:Quit"
},
{
"input": "SRF",
"expectedContent": "Enter PIN to confirm selection:\nSymbol: SRF\nBalance: 2.745987\n0:Back\n9:Quit"
},
{
"input": "1234",
"expectedContent": "Success! SRF is now your active voucher.\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "my_account_change_pin",
"steps": [
@@ -9,7 +71,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "5",
@@ -46,7 +108,11 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "2",
@@ -54,7 +120,7 @@
},
{
"input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit"
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
@@ -74,6 +140,105 @@
}
]
},
{
"name": "menu_my_account_reset_others_pin_with_unregistered_number",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0700000001",
"expectedContent": "The number you have entered is either not registered with Sarafu or is invalid.\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "0",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_my_account_reset_others_pin_with_registered_number",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "Enter other's phone number:\n0:Back"
},
{
"input": "0700000000",
"expectedContent": "{secondary_session_id} will get a PIN reset request.\nPlease enter your PIN to confirm:\n0:Back\n9:Quit"
},
{
"input": "1234",
"expectedContent": "PIN reset request for {secondary_session_id} was successful\n0:Back\n9:Quit"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_my_account_reset_others_pin_with_no_privileges",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "5",
"expectedContent": "PIN Management\n1:Change PIN\n2:Reset other's PIN\n0:Back"
},
{
"input": "2",
"expectedContent": "You do not have privileges to perform this action\n\n9:Quit\n0:Back"
},
{
"input": "0",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_my_account_check_my_balance",
"steps": [
@@ -83,7 +248,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "3",
@@ -95,7 +260,7 @@
},
{
"input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit"
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
@@ -103,7 +268,7 @@
},
{
"input": "1234",
"expectedContent": "Balance: {balance}\n\n0:Back\n9:Quit"
"expectedContent": "{balance}\n\n0:Back\n9:Quit"
},
{
"input": "0",
@@ -111,7 +276,7 @@
},
{
"input": "0",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "0",
@@ -128,7 +293,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "3",
@@ -140,7 +305,7 @@
},
{
"input": "1235",
"expectedContent": "Incorrect PIN. You have: 2 remaining attempt(s).\n1:Retry\n9:Quit"
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
@@ -156,7 +321,7 @@
},
{
"input": "0",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "0",
@@ -173,7 +338,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -230,7 +395,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -267,7 +432,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -277,6 +442,10 @@
"input": "3",
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
},
{
"input": "",
"expectedContent": "Select gender: \n1:Male\n2:Female\n3:Unspecified\n0:Back"
},
{
"input": "1",
"expectedContent": "Please enter your PIN:"
@@ -304,7 +473,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -341,7 +510,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -378,7 +547,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -415,7 +584,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
@@ -427,7 +596,7 @@
},
{
"input": "1234",
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\n\n0:Back\n9:Quit"
"expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: Not Provided\n\n0:Back\n9:Quit"
},
{
"input": "0",
@@ -438,6 +607,47 @@
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
}
]
},
{
"name": "menu_block_account_via_view_profile",
"steps": [
{
"input": "",
"expectedContent": "{balance}\n\n1:Send\n2:My Vouchers\n3:My Account\n4:Help\n9:Quit"
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",
"expectedContent": "My profile\n1:Edit name\n2:Edit family name\n3:Edit gender\n4:Edit year of birth\n5:Edit location\n6:Edit offerings\n7:View profile\n0:Back"
},
{
"input": "7",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Incorrect PIN. You have: {attempts} remaining attempt(s).\n1:Retry\n9:Quit"
},
{
"input": "1",
"expectedContent": "Please enter your PIN:"
},
{
"input": "1254",
"expectedContent": "Your account has been locked. For help on how to unblock your account, contact support at: 0757628885"
}
]
}
]
}

View File

@@ -9,22 +9,22 @@ import (
"regexp"
"testing"
"github.com/gofrs/uuid"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/driver"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/testutil"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/driver"
"github.com/gofrs/uuid"
)
var (
testData = driver.ReadData()
sessionID string
src = rand.NewSource(42)
g = rand.New(src)
logg = logging.NewVanilla().WithDomain("menutraversaltest")
testData = driver.ReadData()
sessionID string
src = rand.NewSource(42)
g = rand.New(src)
secondarySessionId = "+254700000000"
)
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 {
uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g))
@@ -68,6 +68,16 @@ func extractMaxAmount(response []byte) string {
return ""
}
func extractRemainingAttempts(response []byte) string {
// Regex to match "You have: <number> remaining attempt(s)"
re := regexp.MustCompile(`(?m)You have:\s+(\d+)\s+remaining attempt\(s\)`)
match := re.FindSubmatch(response)
if match != nil {
return string(match[1]) // "<number>" of remaining attempts
}
return ""
}
// Extracts the send amount value from the engine response.
func extractSendAmount(response []byte) string {
// Regex to match the pattern "will receive X.XX SYM from"
@@ -80,12 +90,7 @@ func extractSendAmount(response []byte) string {
}
func TestMain(m *testing.M) {
// Parse the flags
flag.Parse()
sessionID = GenerateSessionId()
// set the db
testutil.SetDatabase(*database, *connStr, *dbSchema)
// Cleanup the db after tests
defer testutil.CleanDatabase()
@@ -93,14 +98,51 @@ func TestMain(m *testing.M) {
}
func TestAccountCreationSuccessful(t *testing.T) {
en, fn, eventChannel := testutil.TestEngine(sessionID)
en, fn, eventChannel, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful")
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))
if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
}
if !cont {
break
}
w := bytes.NewBuffer(nil)
_, err = en.Flush(ctx, w)
if err != nil {
t.Fatalf("Test case '%s' failed during Flush: %v", group.Name, err)
}
b := w.Bytes()
match, err := step.MatchesExpectedContent(b)
if err != nil {
t.Fatalf("Error compiling regex for step '%s': %v", step.Input, err)
}
if !match {
t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", step.ExpectedContent, b)
}
}
}
}
<-eventChannel
}
func TestSecondaryAccount(t *testing.T) {
en, fn, eventChannel, _, _ := testutil.TestEngine(secondarySessionId)
defer fn()
ctx := context.Background()
sessions := testData
for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful")
for _, group := range groups {
for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@@ -135,14 +177,15 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
t.Fail()
}
edgeCaseSessionID := v.String()
en, fn, _ := testutil.TestEngine(edgeCaseSessionID)
en, fn, _, _, _ := testutil.TestEngine(edgeCaseSessionID)
defer fn()
ctx := context.Background()
sessions := testData
for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_reject_terms")
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))
if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@@ -170,14 +213,15 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
}
func TestMainMenuHelp(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID)
en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "main_menu_help")
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))
if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@@ -211,7 +255,7 @@ func TestMainMenuHelp(t *testing.T) {
}
func TestMainMenuQuit(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID)
en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
@@ -252,7 +296,7 @@ func TestMainMenuQuit(t *testing.T) {
}
func TestMyAccount_MyAddress(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID)
en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
@@ -296,7 +340,7 @@ func TestMyAccount_MyAddress(t *testing.T) {
}
func TestMainMenuSend(t *testing.T) {
en, fn, _ := testutil.TestEngine(sessionID)
en, fn, _, _, _ := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
sessions := testData
@@ -347,9 +391,12 @@ func TestGroups(t *testing.T) {
if err != nil {
log.Fatalf("Failed to load test groups: %v", err)
}
en, fn, _ := testutil.TestEngine(sessionID)
en, fn, _, pe, flagParser := testutil.TestEngine(sessionID)
defer fn()
ctx := context.Background()
flag_admin_privilege, _ := flagParser.GetFlag("flag_admin_privilege")
// Create test cases from loaded groups
tests := driver.CreateTestCases(groups)
for _, tt := range tests {
@@ -368,9 +415,21 @@ func TestGroups(t *testing.T) {
}
b := w.Bytes()
balance := extractBalance(b)
attempts := extractRemainingAttempts(b)
st := pe.GetState()
if st != nil {
st.SetFlag(flag_admin_privilege)
if tt.Name == "menu_my_account_reset_others_pin_with_no_privileges" {
st.ResetFlag(flag_admin_privilege)
}
}
expectedContent := []byte(tt.ExpectedContent)
expectedContent = bytes.Replace(expectedContent, []byte("{balance}"), []byte(balance), -1)
expectedContent = bytes.Replace(expectedContent, []byte("{attempts}"), []byte(attempts), -1)
expectedContent = bytes.Replace(expectedContent, []byte("{secondary_session_id}"), []byte(secondarySessionId), -1)
tt.ExpectedContent = string(expectedContent)

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -9,7 +9,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "1",

View File

@@ -116,7 +116,7 @@
},
{
"input": "3",
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back"
"expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back"
},
{
"input": "6",

View File

@@ -12,7 +12,7 @@ func (p *Profile) InsertOrShift(index int, value string) {
for len(p.ProfileItems) < index {
p.ProfileItems = append(p.ProfileItems, "0")
}
p.ProfileItems = append(p.ProfileItems, "0")
p.ProfileItems = append(p.ProfileItems, "0")
p.ProfileItems[index] = value
}
}

42
profile/profile_test.go Normal file
View File

@@ -0,0 +1,42 @@
package profile
import (
"testing"
"github.com/alecthomas/assert/v2"
"github.com/stretchr/testify/require"
)
func TestInsertOrShift(t *testing.T) {
tests := []struct {
name string
profile Profile
index int
value string
expected []string
}{
{
name: "Insert within range",
profile: Profile{ProfileItems: []string{"A", "B", "C"}, Max: 5},
index: 1,
value: "X",
expected: []string{"A", "X"},
},
{
name: "Insert beyond range",
profile: Profile{ProfileItems: []string{"A"}, Max: 5},
index: 3,
value: "Y",
expected: []string{"A", "0", "0", "Y"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := tt.profile
p.InsertOrShift(tt.index, tt.value)
require.NotNil(t, p.ProfileItems)
assert.Equal(t, tt.expected, p.ProfileItems)
})
}
}

View File

@@ -1,16 +1,17 @@
//go:build !online
// +build !online
package services
import (
"fmt"
"context"
"fmt"
"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-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
)
type localEmitter struct {
@@ -37,7 +38,7 @@ func (d *localEmitter) emit(ctx context.Context, msg apievent.Msg) error {
return err
}
func New(ctx context.Context, storageService storage.StorageService, conn storage.ConnData) remote.AccountService {
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)

View File

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

View File

@@ -1,5 +1,4 @@
LOAD check_identifier 0
RELOAD check_identifier
MAP check_identifier
MOUT back 0
MOUT quit 9

Binary file not shown.

View File

@@ -1,12 +1,12 @@
LOAD reset_transaction_amount 0
LOAD max_amount 10
LOAD max_amount 40
RELOAD max_amount
MAP max_amount
MOUT back 0
HALT
LOAD validate_amount 64
RELOAD validate_amount
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
CATCH invalid_amount flag_invalid_amount 1
INCMP _ 0
LOAD get_recipient 0

View File

@@ -1 +1 @@
Failed to connect to the custodial service.Please try again.
Failed to connect to the custodial service. Please try again.

View File

@@ -1,5 +1,7 @@
LOAD reset_api_call_failure 6
RELOAD reset_api_call_failure
MOUT retry 1
MOUT quit 9
HALT
INCMP _ 1
INCMP ^ 1
INCMP quit 9

View File

@@ -0,0 +1 @@
Imeshindwa kuunganisha kwenye huduma ya uangalizi. Tafadhali jaribu tena.

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} will get a PIN reset request.
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
MOUT quit 9
LOAD authorize_account 6
HALT
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
INCMP _ 0
INCMP quit 9
INCMP pin_reset_result *

View File

@@ -0,0 +1,2 @@
{{.retrieve_blocked_number}} atapokea ombi la kuweka upya PIN.
Tafadhali weka PIN yako kudhibitisha:

Binary file not shown.

View File

@@ -1,5 +1,6 @@
LOAD check_transactions 0
RELOAD check_transactions
CATCH api_failure flag_api_call_error 1
CATCH no_transfers flag_no_transfers 1
LOAD authorize_account 6
MOUT back 0

View File

@@ -1,6 +1,6 @@
LOAD reset_incorrect 6
LOAD fetch_community_balance 0
CATCH api_failure flag_api_call_error 1
CATCH api_failure flag_api_call_error 1
MAP fetch_community_balance
CATCH incorrect_pin flag_incorrect_pin 1
CATCH pin_entry flag_account_authorized 0

View File

@@ -1,4 +1,7 @@
LOAD save_temporary_pin 6
MOUT back 0
HALT
INCMP _ 0
LOAD verify_create_pin 8
RELOAD verify_create_pin
CATCH pin_mismatch flag_pin_mismatch 1
INCMP account_creation *

View File

@@ -0,0 +1,2 @@
Your full alias will be: {{.get_suggested_alias}}
Please enter your PIN to confirm:

View File

@@ -0,0 +1,12 @@
LOAD reset_invalid_pin 6
RELOAD reset_invalid_pin
LOAD get_suggested_alias 0
RELOAD get_suggested_alias
MAP get_suggested_alias
MOUT back 0
HALT
INCMP _ 0
RELOAD authorize_account
CATCH incorrect_pin flag_incorrect_pin 1
CATCH invalid_pin flag_invalid_pin 1
CATCH update_alias flag_allow_update 1

View File

@@ -0,0 +1,2 @@
Lakabu yako kamili itakuwa: {{.get_suggested_alias}}
Tafadhali weka PIN yako ili kuthibitisha:

View File

@@ -1 +0,0 @@
Please confirm new PIN for:{{.retrieve_blocked_number}}

View File

@@ -1,14 +0,0 @@
CATCH pin_entry flag_incorrect_pin 1
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
CATCH invalid_others_pin flag_valid_pin 0
CATCH pin_reset_result flag_account_authorized 1
LOAD save_others_temporary_pin 6
RELOAD save_others_temporary_pin
MOUT back 0
HALT
INCMP _ 0
LOAD check_pin_mismatch 0
RELOAD check_pin_mismatch
CATCH others_pin_mismatch flag_pin_mismatch 1
INCMP pin_entry *

View File

@@ -1 +0,0 @@
Tafadhali thibitisha PIN mpya ya: {{.retrieve_blocked_number}}

View File

@@ -1,5 +1,7 @@
CATCH invalid_pin flag_valid_pin 0
MOUT back 0
HALT
INCMP _ 0
INCMP * pin_reset_success
LOAD confirm_pin_change 0
RELOAD confirm_pin_change
CATCH pin_mismatch flag_pin_mismatch 1
INCMP pin_reset_success *

Binary file not shown.

View File

@@ -2,8 +2,8 @@ LOAD create_account 0
CATCH account_creation_failed flag_account_creation_failed 1
MOUT exit 0
HALT
INCMP quit 0
LOAD save_temporary_pin 6
RELOAD save_temporary_pin
CATCH . flag_incorrect_pin 1
INCMP quit 0
CATCH invalid_pin flag_invalid_pin 1
INCMP confirm_create_pin *

Binary file not shown.

View File

@@ -1,7 +1,10 @@
CATCH no_admin_privilege flag_admin_privilege 0
CATCH no_admin_privilege flag_admin_privilege 0
LOAD reset_account_authorized 0
RELOAD reset_account_authorized
MOUT back 0
HALT
INCMP _ 0
INCMP enter_others_new_pin *
LOAD validate_blocked_number 6
RELOAD validate_blocked_number
CATCH unregistered_number flag_unregistered_number 1
INCMP authorize_reset_others_pin *

View File

@@ -1 +0,0 @@
Please enter new PIN for: {{.retrieve_blocked_number}}

View File

@@ -1,12 +0,0 @@
LOAD validate_blocked_number 6
RELOAD validate_blocked_number
CATCH unregistered_number flag_unregistered_number 1
LOAD retrieve_blocked_number 0
RELOAD retrieve_blocked_number
MAP retrieve_blocked_number
MOUT back 0
HALT
LOAD verify_new_pin 6
RELOAD verify_new_pin
INCMP _ 0
INCMP * confirm_others_new_pin

View File

@@ -1 +0,0 @@
Tafadhali weka PIN mpya ya: {{.retrieve_blocked_number}}

Binary file not shown.

Binary file not shown.

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