This commit is contained in:
swrup 2025-12-11 08:48:16 +01:00
parent 262aeaec66
commit 2d67963656
4 changed files with 168 additions and 0 deletions

View file

@ -139,3 +139,16 @@ let management_global_fees req server _env =
Ok ""
in
respond_with_res res req
let management_wire_jsont = WireSetupMessage.jsont
let management_wire req server _env =
let open Management in
let db_conn = Vif.Server.device Devices.db_connection server in
let res =
let* v = Vif.Request.of_json req |> unwrap_err_msg in
let* () = verify_wire v in
let* () = update_wire ~db_conn v in
Ok ""
in
respond_with_res res req

View file

@ -386,3 +386,54 @@ let update_global_fees ~db_conn v =
| None ->
let+ () = Pg.insert_global_fee db_conn v |> unwrap_err_caqti in
()
[@@@ocaml.warning "-27"]
let verify_wire
WireSetupMessage.
{
payto_uri;
master_sig_wire;
master_sig_add;
validity_start;
bank_label;
priority;
} =
(* TODO wire *)
let conversion_url = "" in
let credit_restrictions = "" in
let debit_restrictions = "" in
let open Bin_type in
let* () =
let open Bin_sig.MasterWireDetails in
verify ~key:Config.Exchange.master_public_key master_sig_wire
{
h_wire_details= FullPaytoHash.hash payto_uri;
h_conversion_url= Hash_64_cstr.hash conversion_url;
h_credit_restrictions= Hash_64_cstr.hash credit_restrictions;
h_debit_restrictions= Hash_64_cstr.hash debit_restrictions;
}
in
let* () =
let open Bin_sig.MasterAddWire in
verify ~key:Config.Exchange.master_public_key master_sig_add
{
start_date= validity_start;
h_wire= FullPaytoHash.hash payto_uri;
h_conversion_url= Hash_64_cstr.hash conversion_url;
h_credit_restrictions= Hash_64_cstr.hash credit_restrictions;
h_debit_restrictions= Hash_64_cstr.hash debit_restrictions;
}
in
Ok ()
let update_wire ~db_conn v =
let* last_change_opt =
let payto_uri = v.WireSetupMessage.payto_uri in
Pg.lookup_wire_timestamp db_conn ~payto_uri |> unwrap_err_caqti
in
match last_change_opt with
| Some _ -> Error "wire already setup"
| None ->
let+ () = Pg.insert_wire db_conn v |> unwrap_err_caqti in
()

View file

@ -53,6 +53,7 @@ let routes =
--> management_wire_fee;
post (v "management" / "global-fees") management_global_fees_jsont
--> management_global_fees;
post (v "management" / "wire") management_wire_jsont --> management_wire;
]
let () =

103
src/pg.ml
View file

@ -33,8 +33,12 @@ module Caqti_type = struct
let eddsa_pub = EddsaPublicKey.caqti
let eddsa_sig = EddsaSignature.caqti
(* TODO json strings? *)
let json_str = Caqti_type.string
(* todo: enum type for wire_method? *)
let wire_method = Caqti_type.string
let payto_uri = Caqti_type.string
include struct
(* alias for hash *)
@ -297,3 +301,102 @@ let insert_global_fee =
history_expiration,
purse_account_limit,
master_sig )
let lookup_wire_timestamp =
let lookup_wire_timestamp =
Caqti_type.(payto_uri ->? time)
"SELECT last_change FROM wire_accounts WHERE payto_uri=$1"
in
fun (module Conn : CONN) ~payto_uri ->
Conn.find_opt lookup_wire_timestamp payto_uri
let insert_wire =
let insert_wire =
let master_sig = Bin_sig.MasterWireDetails.caqti in
Caqti_type.(
t8 payto_uri string json_str json_str master_sig time (option string)
(option int)
->. unit)
"INSERT INTO wire_accounts (payto_uri, conversion_url, \
debit_restrictions, credit_restrictions, master_sig, is_active, \
last_change, bank_label, priority) VALUES \
($1,$2,$3::TEXT::JSONB,$4::TEXT::JSONB,$5,true,$6,$7,$8)"
in
fun (module Conn : CONN)
Api.WireSetupMessage.
{
payto_uri;
master_sig_wire;
master_sig_add= _;
validity_start;
bank_label;
priority;
}
->
(* TODO wire
what about master_sig_add ? *)
let conversion_url = "" in
let credit_restrictions = "" in
let debit_restrictions = "" in
Conn.exec insert_wire
( payto_uri,
conversion_url,
debit_restrictions,
credit_restrictions,
master_sig_wire,
validity_start,
bank_label,
priority )
let update_wire =
let update_wire =
let master_sig = Bin_sig.MasterWireDetails.caqti in
Caqti_type.(
t9 payto_uri bool string json_str json_str time master_sig (option string)
(option int)
->. unit)
"UPDATE wire_accounts SET is_active=$2, conversion_url=$3, \
debit_restrictions=$4::TEXT::JSONB, \
credit_restrictions=$5::TEXT::JSONB, last_change=$6, master_sig=$7, \
bank_label=$8, priority=$9 WHERE payto_uri=$1"
in
fun (module Conn : CONN)
Api.WireSetupMessage.
{
payto_uri;
master_sig_wire;
master_sig_add= _;
validity_start;
bank_label;
priority;
}
->
(* TODO wire *)
let conversion_url = "" in
let credit_restrictions = "" in
let debit_restrictions = "" in
let enabled = true in
Conn.exec update_wire
( payto_uri,
enabled,
conversion_url,
debit_restrictions,
credit_restrictions,
validity_start,
master_sig_wire,
bank_label,
priority )
let disable_wire =
let disable_wire =
(* TODO
check syntax on this
don't erase old values with null and just change `is_active` and `last_change`? *)
Caqti_type.(t2 payto_uri time ->. unit)
"UPDATE wire_accounts SET is_active=false, conversion_url=NULL, \
debit_restrictions=NULL::TEXT::JSONB, \
credit_restrictions=NULL::TEXT::JSONB, last_change=$2, master_sig=NULL, \
bank_label=NULL, priority=NULL WHERE payto_uri=$1"
in
fun (module Conn : CONN) ~payto_uri ~validity_end ->
Conn.exec disable_wire (payto_uri, validity_end)