This commit is contained in:
parent
0a45e7fe95
commit
5a8f626fed
16 changed files with 98 additions and 13 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,4 +1,5 @@
|
||||||
_build
|
_build
|
||||||
|
assets
|
||||||
data/secmod/*
|
data/secmod/*
|
||||||
!data/secmod/.gitkeep
|
!data/secmod/.gitkeep
|
||||||
|
|
||||||
|
|
|
||||||
74
default/assets/mte.conf
Normal file
74
default/assets/mte.conf
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
[currency-EUR]
|
||||||
|
enabled= YES
|
||||||
|
code= EUR
|
||||||
|
name= euro
|
||||||
|
fractional_input_digits= 2
|
||||||
|
fractional_normal_digits= 2
|
||||||
|
fractional_trailing_zero_digits= 2
|
||||||
|
alt_unit_names= "{"0":"€","3":"k€"}"
|
||||||
|
|
||||||
|
[exchange]
|
||||||
|
currency = EUR
|
||||||
|
currency_round_unit = EUR:0.01
|
||||||
|
db = postgres
|
||||||
|
attribute_encryption_key = "deadbeef"
|
||||||
|
port = 3434
|
||||||
|
bind_to = localhost
|
||||||
|
master_public_key = "SJ0NYND22VQP3MP7FM754RDX8HCKVWAXTHY9SQNBTPRJZ2SPM2S0"
|
||||||
|
stefan_abs = EUR:0.00
|
||||||
|
stefan_log = EUR:0.00
|
||||||
|
stefan_lin = 0.00
|
||||||
|
aggregator_idle_sleep_interval = "1 hour"
|
||||||
|
closer_idle_sleep_interval = "1 hour"
|
||||||
|
transfer_idle_sleep_interval = "1 hour"
|
||||||
|
wirewatch_idle_sleep_interval = "1 hour"
|
||||||
|
signkey_legal_duration = "1 year"
|
||||||
|
max_keys_caching = "4 weeks"
|
||||||
|
enable_kyc = NO
|
||||||
|
terms_etag = "0"
|
||||||
|
privacy_etag = "0"
|
||||||
|
base_url = "http://localhost:3434/"
|
||||||
|
|
||||||
|
[exchangedb]
|
||||||
|
idle_reserve_expiration_time = "1 year 2 weeks 3 hours 4 minutes 5 seconds"
|
||||||
|
legal_reserve_expiration_time = "1 year"
|
||||||
|
aggregator_shift = "1 year"
|
||||||
|
max_aml_program_runtime = "1 year"
|
||||||
|
default_purse_limit = 9999
|
||||||
|
|
||||||
|
[exchangedb-postgres]
|
||||||
|
config = "pgx://mte:hunter2@localhost:5432/taler-exchange"
|
||||||
|
|
||||||
|
[taler-exchange-secmod-rsa]
|
||||||
|
lookahead_sign = "1 year"
|
||||||
|
overlap_duration = "1 year"
|
||||||
|
|
||||||
|
[taler-exchange-secmod-eddsa]
|
||||||
|
lookahead_sign = "1 year"
|
||||||
|
overlap_duration = "1 year"
|
||||||
|
|
||||||
|
[coin_kudo_1]
|
||||||
|
value= EUR:0.01
|
||||||
|
duration_withdraw= "1 year"
|
||||||
|
duration_spend= "1 year"
|
||||||
|
duration_legal= "1 year"
|
||||||
|
fee_withdraw= EUR:0.00
|
||||||
|
fee_deposit= EUR:0.00
|
||||||
|
fee_refresh= EUR:0.00
|
||||||
|
fee_refund= EUR:0.00
|
||||||
|
cipher= RSA
|
||||||
|
rsa_keysize= 2048
|
||||||
|
age_restricted= NO
|
||||||
|
|
||||||
|
[coin_kudo_2]
|
||||||
|
value= EUR:0.02
|
||||||
|
duration_withdraw= "1 year"
|
||||||
|
duration_spend= "1 year"
|
||||||
|
duration_legal= "1 year"
|
||||||
|
fee_withdraw= EUR:0.00
|
||||||
|
fee_deposit= EUR:0.00
|
||||||
|
fee_refresh= EUR:0.00
|
||||||
|
fee_refund= EUR:0.00
|
||||||
|
cipher= RSA
|
||||||
|
rsa_keysize= 2048
|
||||||
|
age_restricted= NO
|
||||||
1
default/assets/privacy/en/0.md
Normal file
1
default/assets/privacy/en/0.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# TODO dummy ToS
|
||||||
1
default/assets/privacy/en/0.txt
Normal file
1
default/assets/privacy/en/0.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# TODO dummy ToS
|
||||||
1
default/assets/terms/en/0.md
Normal file
1
default/assets/terms/en/0.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# TODO dummy ToS
|
||||||
1
default/assets/terms/en/0.txt
Normal file
1
default/assets/terms/en/0.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
# TODO dummy ToS
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
open Parse_config
|
open Parse_config
|
||||||
|
|
||||||
|
let config_filename = "mte.conf"
|
||||||
|
let secrets_dir = Fpath.v "secrets"
|
||||||
|
|
||||||
let config_data =
|
let config_data =
|
||||||
let path = Fpath.to_string (Fpath.v "default.config") in
|
match Assets_crunch.read config_filename with
|
||||||
match Assets_crunch.read path with
|
| None -> fail "static file not found: `%s`" config_filename
|
||||||
| None -> fail "static file not found: `%s`" path
|
|
||||||
| Some data ->
|
| Some data ->
|
||||||
let v = Config_section.parse data in
|
let v = Config_section.parse data in
|
||||||
v
|
v
|
||||||
|
|
|
||||||
4
src/dune
4
src/dune
|
|
@ -37,8 +37,8 @@
|
||||||
(rule
|
(rule
|
||||||
(target assets_crunch.ml)
|
(target assets_crunch.ml)
|
||||||
(deps
|
(deps
|
||||||
(source_tree ../data/assets/))
|
(source_tree ../assets))
|
||||||
(action
|
(action
|
||||||
(with-stdout-to
|
(with-stdout-to
|
||||||
%{null}
|
%{null}
|
||||||
(run ocaml-crunch -m plain ../data/assets -o %{target}))))
|
(run ocaml-crunch -m plain ../assets -o %{target}))))
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,6 @@ module Make (Conn : Pg.CONN) = struct
|
||||||
dn_section_name_ht: (denomination_hash, string) Hashtbl.t;
|
dn_section_name_ht: (denomination_hash, string) Hashtbl.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
let dir = Fpath.(v "data" / "secmod")
|
|
||||||
|
|
||||||
let db_lookup_signkey_data conn fname pub =
|
let db_lookup_signkey_data conn fname pub =
|
||||||
let* opt = Pg.find_signkey conn pub |> unwrap_err_caqti in
|
let* opt = Pg.find_signkey conn pub |> unwrap_err_caqti in
|
||||||
match opt with
|
match opt with
|
||||||
|
|
@ -112,9 +110,13 @@ module Make (Conn : Pg.CONN) = struct
|
||||||
let error_invalid_state =
|
let error_invalid_state =
|
||||||
Fmt.error "secmod load error: invalid store state."
|
Fmt.error "secmod load error: invalid store state."
|
||||||
in
|
in
|
||||||
let* sm_key_priv = Data_file.read_eddsa Fpath.(dir / "sk_sm") in
|
let* sm_key_priv =
|
||||||
|
Data_file.read_eddsa Fpath.(Config.secrets_dir / "sk_sm")
|
||||||
|
in
|
||||||
let* signkeys =
|
let* signkeys =
|
||||||
let l = List.init 1 (fun i -> Fpath.(dir / Fmt.str "sk_%d" i)) in
|
let l =
|
||||||
|
List.init 1 (fun i -> Fpath.(Config.secrets_dir / Fmt.str "sk_%d" i))
|
||||||
|
in
|
||||||
let* l = list_map (fun fname -> load_signkey conn fname) l in
|
let* l = list_map (fun fname -> load_signkey conn fname) l in
|
||||||
match opt_list l with Error () -> error_invalid_state | Ok opt -> Ok opt
|
match opt_list l with Error () -> error_invalid_state | Ok opt -> Ok opt
|
||||||
in
|
in
|
||||||
|
|
@ -125,7 +127,7 @@ module Make (Conn : Pg.CONN) = struct
|
||||||
list_map
|
list_map
|
||||||
(fun coin ->
|
(fun coin ->
|
||||||
let section_name = coin.section_name in
|
let section_name = coin.section_name in
|
||||||
let fname = Fpath.(dir / section_name) in
|
let fname = Fpath.(Config.secrets_dir / section_name) in
|
||||||
let* opt = Data_file.read_rsa fname in
|
let* opt = Data_file.read_rsa fname in
|
||||||
match opt with
|
match opt with
|
||||||
| None -> Ok None
|
| None -> Ok None
|
||||||
|
|
@ -378,12 +380,14 @@ module Make (Conn : Pg.CONN) = struct
|
||||||
|
|
||||||
let store () =
|
let store () =
|
||||||
Miou.Mutex.protect t.lock @@ fun () ->
|
Miou.Mutex.protect t.lock @@ fun () ->
|
||||||
let* () = Data_file.write_eddsa Fpath.(dir / "sk_sm") t.sm_key_priv in
|
let* () =
|
||||||
|
Data_file.write_eddsa Fpath.(Config.secrets_dir / "sk_sm") t.sm_key_priv
|
||||||
|
in
|
||||||
let* () =
|
let* () =
|
||||||
Hashtbl.to_seq_values t.sk_ht
|
Hashtbl.to_seq_values t.sk_ht
|
||||||
|> List.of_seq
|
|> List.of_seq
|
||||||
|> List.mapi (fun i (key : signkey) ->
|
|> List.mapi (fun i (key : signkey) ->
|
||||||
let fname = Fpath.(dir / Fmt.str "sk_%d" i) in
|
let fname = Fpath.(Config.secrets_dir / Fmt.str "sk_%d" i) in
|
||||||
(fname, key.priv))
|
(fname, key.priv))
|
||||||
|> list_iter (fun (fname, key) -> Data_file.write_eddsa fname key)
|
|> list_iter (fun (fname, key) -> Data_file.write_eddsa fname key)
|
||||||
in
|
in
|
||||||
|
|
@ -397,7 +401,7 @@ module Make (Conn : Pg.CONN) = struct
|
||||||
| None -> Error "invalid state, section_name not found"
|
| None -> Error "invalid state, section_name not found"
|
||||||
| Some s -> Ok s
|
| Some s -> Ok s
|
||||||
in
|
in
|
||||||
let fname = Fpath.(dir / section_name) in
|
let fname = Fpath.(Config.secrets_dir / section_name) in
|
||||||
(fname, key.priv))
|
(fname, key.priv))
|
||||||
in
|
in
|
||||||
list_iter (fun (fname, key) -> Data_file.write_rsa fname key) l
|
list_iter (fun (fname, key) -> Data_file.write_rsa fname key) l
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue