diff --git a/src/management.ml b/src/management.ml index 92b53def..123541dc 100644 --- a/src/management.ml +++ b/src/management.ml @@ -65,24 +65,24 @@ let mk_future_signkey ~sm_signkey_priv FutureSignKey. { key= pub; stamp_start; stamp_expire; stamp_end; signkey_secmod_sig } -let mk_future_keys_response (secmod_signkey : Secmod_signkey.t) - (secmod_denom : Secmod_denom.t) = +let mk_future_keys_response ~(sm_signkey : Secmod_signkey.t) + ~(sm_denom : Secmod_denom.t) = let future_denoms = - secmod_denom.keys + sm_denom.keys |> List.filter (fun k -> Option.is_none k.Denomination.master_sig) |> List.map (fun denom -> - mk_future_denom ~sm_denom_priv:secmod_denom.sm_key.Signkey.priv denom) + mk_future_denom ~sm_denom_priv:sm_denom.sm_key.Signkey.priv denom) in let future_signkeys = - secmod_signkey.keys + sm_signkey.keys |> List.filter (fun k -> Option.is_none k.Signkey.master_sig) |> List.map (fun signkey -> - mk_future_signkey ~sm_signkey_priv:secmod_signkey.sm_key.Signkey.priv + mk_future_signkey ~sm_signkey_priv:sm_signkey.sm_key.Signkey.priv signkey) in let master_pub = Config.Exchange.master_public_key in - let denom_secmod_public_key = secmod_denom.sm_key.pub in - let signkey_secmod_public_key = secmod_signkey.sm_key.pub in + let denom_secmod_public_key = sm_denom.sm_key.pub in + let signkey_secmod_public_key = sm_signkey.sm_key.pub in FutureKeysResponse. { future_denoms; @@ -92,13 +92,54 @@ let mk_future_keys_response (secmod_signkey : Secmod_signkey.t) signkey_secmod_public_key; } -let keys_get req server _env = +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 secmod_signkey = Vif.Server.device Devices.secmod_signkey server in - let secmod_denom = Vif.Server.device Devices.secmod_denom server in - let v = mk_future_keys_response secmod_signkey secmod_denom in - let s = Api.encode_exn Api.FutureKeysResponse.jsont v in - let* () = with_string req s 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 -> respond_with_plain_text_error err req + | Ok content -> respond_with_ok_json content req + +let 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 = 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 store_master_signatures _ = + (* TODO *) + Ok () + +let verify_master_signatures ~sm_signkey:_ ~sm_denom:_ _ = Ok () + +let keys_post 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 open Syntax in + let* master_signatures = Ok () in + let* () = + verify_master_signatures ~sm_signkey ~sm_denom master_signatures + in + let* () = store_master_signatures () in + Ok "" + in + respond_with_res res req diff --git a/src/mte.ml b/src/mte.ml index 4f660718..9d10ef09 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -29,6 +29,7 @@ let routes = get (rel / "terms" /?? nil) --> Static.terms; get (rel / "privacy" /?? nil) --> Static.privacy; get (rel / "management" / "keys" /?? nil) --> Management.keys_get; + get (rel / "management" / "keys" /?? nil) --> Management.keys_post; ] let () =