diff --git a/src/handler.ml b/src/handler.ml index c18eac14..a31b45b9 100644 --- a/src/handler.ml +++ b/src/handler.ml @@ -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 diff --git a/src/management.ml b/src/management.ml index ad69429c..fcc96728 100644 --- a/src/management.ml +++ b/src/management.ml @@ -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 + () diff --git a/src/mte.ml b/src/mte.ml index b15f8636..44215b2f 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -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 () = diff --git a/src/pg.ml b/src/pg.ml index c9c22736..4ffb9f44 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -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)