From aa18d4b3d1fd0fa3fc57da8088db6cf5b73ec159 Mon Sep 17 00:00:00 2001 From: swrup Date: Sun, 21 Dec 2025 22:13:35 +0100 Subject: [PATCH] --- src/api.ml | 1 + src/pg.ml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/api.ml b/src/api.ml index 74f40b79..80c19d60 100644 --- a/src/api.ml +++ b/src/api.ml @@ -70,6 +70,7 @@ module B32 = struct ~decode:B32.decode Caqti_type.string end +(* TODO use DenominationHash directly *) module HashCode : sig type t diff --git a/src/pg.ml b/src/pg.ml index c57bc8e2..677d134c 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -9,7 +9,9 @@ GNU Taler db-events? it seems caqti/pgx does not support it - transaction *) + transaction + + should check validity of signatures got from db, for /management at least *) module type CONN = Caqti_miou.CONNECTION @@ -185,7 +187,7 @@ let insert_auditor_denom_sig = fun (module Conn : CONN) ~auditor_pub ~h_denom_pub ~auditor_sig -> Conn.exec insert_auditor_denom_sig (auditor_pub, h_denom_pub, auditor_sig) -let get_auditors = +let _get_auditors = let get_auditors = Caqti_type.(unit ->* t3 eddsa_pub string string) "SELECT auditor_pub, auditor_url, auditor_name FROM auditors WHERE \ @@ -193,7 +195,7 @@ let get_auditors = in fun (module Conn : CONN) () -> Conn.collect_list get_auditors () -let get_auditor_denoms = +let _get_auditor_denoms = let get_auditor_denoms = let auditor_sig = Bin_sig.ExchangeKeyValidity.caqti in Caqti_type.(unit ->* t3 eddsa_pub denomination_hash auditor_sig) @@ -204,6 +206,55 @@ let get_auditor_denoms = in fun (module Conn : CONN) () -> Conn.collect_list get_auditor_denoms () +(* TODO check that url and name are unique/same for each auditor_pub *) +(* WIP get_auditor_keys + fetch all auditor keys data *) +let get_auditor_keys = + let get_auditor_keys = + let auditor_sig = Bin_sig.ExchangeKeyValidity.caqti in + Caqti_type.( + unit ->* t5 eddsa_pub string string denomination_hash auditor_sig) + "SELECT auditors.auditor_pub, auditors.url, auditors.name, \ + denominations.denom_pub_hash, auditor_denom_sigs.auditor_sig FROM \ + auditor_denom_sigs JOIN auditors USING (auditor_uuid) JOIN \ + denominations USING (denominations_serial) WHERE auditors.is_active" + in + fun (module Conn : CONN) () -> + let open Syntax in + let* l = Conn.collect_list get_auditor_keys () |> unwrap_err_caqti in + let* l = + (* TODO improve DenominationHash/HashCode situation *) + list_map + (fun (pub, url, name, denom_pub_h, auditor_sig) -> + let denom_pub_h = Bin_type.DenominationHash.to_octets denom_pub_h in + let* denom_pub_h = HashCode.of_b32 denom_pub_h in + Ok (pub, url, name, denom_pub_h, auditor_sig)) + l + in + let ht = Hashtbl.create 0xff in + List.iter + (fun (pub, url, name, denom_pub_h, auditor_sig) -> + let k = (pub, url, name) in + match Hashtbl.find_opt ht k with + | None -> Hashtbl.replace ht k [ (denom_pub_h, auditor_sig) ] + | Some l -> Hashtbl.replace ht k ((denom_pub_h, auditor_sig) :: l)) + l; + let l = Hashtbl.to_seq ht |> List.of_seq in + let l = + List.map + (fun ((auditor_pub, auditor_url, auditor_name), auditor_denoms) -> + let denomination_keys = + List.map + (fun (denom_pub_h, auditor_sig) -> + AuditorDenominationKey.{ denom_pub_h; auditor_sig }) + auditor_denoms + in + AuditorKeys. + { auditor_pub; auditor_url; auditor_name; denomination_keys }) + l + in + Ok l + let insert_wire_fee = let insert_wire_fee = let master_sig = Bin_sig.MasterWireFee.caqti in