module Respond_util = struct let respond_with_plain_text_error ?status e req = let open Vif.Response in let open Syntax in let status = Option.value ~default:`Bad_request status in let* () = add ~field:"content-type" "text/plain; charset=utf-8" in let* () = with_string req e in respond status let respond_with_ok_json content req = let open Vif.Response in let open Syntax in let* () = add ~field:"content-type" "application/json" in let* () = with_string req content in respond `OK let respond_with_res res req = match res with | Error err -> Logs.err (fun m -> m "%s." err); let err = Fmt.str "%s@." err in respond_with_plain_text_error err req | Ok content -> respond_with_ok_json content req end include Respond_util open Api let management_keys_get req server _env = let sm_signkey = Vif.Server.device Devices.secmod_signkey server in let sm_denom = Vif.Server.device Devices.secmod_denom server in let res = let v = Management.mk_future_keys_response ~sm_signkey ~sm_denom in let s = Api.encode_exn Api.FutureKeysResponse.jsont v in Ok s in respond_with_res res req let management_keys_post_jsont = MasterSignatures.jsont let management_keys_post req server _env = let open Syntax in let open Management in let db_conn = Vif.Server.device Devices.db_connection server in let sm_signkey = Vif.Server.device Devices.secmod_signkey server in let sm_denom = Vif.Server.device Devices.secmod_denom server in let res = let* master_signatures = Vif.Request.of_json req |> unwrap_err_msg in let* () = verify_master_signatures ~sm_signkey ~sm_denom master_signatures in let* () = update_master_signatures ~db_conn ~sm_signkey ~sm_denom master_signatures in Ok "" in respond_with_res res req let management_denom_revoke_jsont = DenomRevocationSignature.jsont let management_denom_revoke req h_denom_pub server _env = let open Syntax in let open Management in let db_conn = Vif.Server.device Devices.db_connection server in let _sm_signkey = Vif.Server.device Devices.secmod_signkey server in let sm_denom = Vif.Server.device Devices.secmod_denom server in let res = let* h_denom_pub = HashCode.of_b32 h_denom_pub in let h_denom_pub = HashCode.to_denomination_hash h_denom_pub in let* v = Vif.Request.of_json req |> unwrap_err_msg in let* () = verify_denom_revocation_sig h_denom_pub v in let* () = update_denom_revocation ~db_conn ~sm_denom h_denom_pub v in Ok "" in respond_with_res res req