-module(v1). -export([add_chain/3, add_pre_chain/3, get_sth/3, get_sth_consistency/3, get_proof_by_hash/3, get_entries/3, get_roots/3, get_entry_and_proof/3]). -export([hello/3]). -include("$CTROOT/plop/include/plop.hrl"). -define(PROTOCOL_VERSION, 0). %% Public functions. add_chain(SessionID, _Env, Input) -> Res = case (catch jiffy:decode(Input)) of {error, E} -> html("add-chain: bad input; see RFC 6962", E); {[{<<"chain">>, Chain}]} -> Entry = #plop_entry{type = x509, data = list_to_binary(Chain)}, SPT = plop:add(#timestamped_entry{entry = Entry}), R = [{sct_version, ?PROTOCOL_VERSION}, {id, base64:encode(SPT#spt.logid)}, {timestamp, SPT#spt.timestamp}, {extensions, base64:encode("")}, {signature, base64:encode( list_to_binary(plop:serialise(SPT#spt.signature)))}], binary_to_list(jiffy:encode({R})); _ -> html("add-chain: missing input: chain; see RFC 6962", Input) end, deliver(SessionID, Res). add_pre_chain(SessionID, _Env, _Input) -> niy(SessionID). get_sth(SessionID, _Env, _Input) -> #sth{ treesize = Treesize, timestamp = Timestamp, roothash = Roothash, signature = Signature} = plop:sth(), R = [{tree_size, Treesize}, {timestamp, Timestamp}, {sha256_root_hash, base64:encode(Roothash)}, {tree_head_signature, base64:encode( list_to_binary(plop:serialise(Signature)))}], deliver(SessionID, binary_to_list(jiffy:encode({R}))). get_sth_consistency(SessionID, _Env, _Input) -> niy(SessionID). get_proof_by_hash(SessionID, _Env, _Input) -> niy(SessionID). get_entries(SessionID, _Env, _Input) -> niy(SessionID). get_entry_and_proof(SessionID, _Env, _Input) -> niy(SessionID). get_roots(SessionID, _Env, _Input) -> R = [{certificates, []}], % NIY. deliver(SessionID, binary_to_list(jiffy:encode({R}))). %% For testing. FIXME: Remove. hello(SessionID, Env, Input) -> Query = httpd:parse_query(Input), mod_esi:deliver(SessionID, io_lib:format( "Content-Type: text/html\r\n\r\n" ++ "hello again, erlang world" ++ "

SessionID: ~p~n" ++ "

Env: ~p~n" ++ "

Input, raw: ~p~n" ++ "

Input, parsed: ~p~n" ++ "", [SessionID, Env, Input, Query])). %% Private functions. html(Text, Input) -> io_lib:format( "Content-Type: text/html\r\n\r\n" ++ "

~n" ++ "~s~n" ++ "~p~n" ++ "~n", [Text, Input]). niy(S) -> mod_esi:deliver(S, html("NIY - Not Yet Implemented|", [])). -spec deliver(any(), string()) -> ok | {error, _Reason}. deliver(Session, Data) -> mod_esi:deliver(Session, Data).